2011-04-11 7 views
5

Estoy creando un servicio web SOAP simple usando las anotaciones de SLSB y JAX-WS . Los objetos que me gustaría aprobar son JAXB generados a partir de esquemas OGC, gracias por el proyecto OGC en java.net. Un método particular con el que tengo problemas (que hace que la implementación falle) es una situación en la que un campo (eventTime) del objeto de solicitud (GetResult) está en un paquete diferente que el objeto de solicitud . ObjectFactory para este tipo es diferente y es un problema al marshalling/unmarshalling.Especifique los paquetes de JAXB en SLSB y JAX-WS

Un subconjunto de los errores que estoy recibiendo:

There's no ObjectFactory with an @XmlElementDecl for the element {http://www.opengis.net/ogc}temporalOps. this problem is related to the following location: at protected javax.xml.bind.JAXBElement net.opengis.sos.v_1_0_0.GetResult$EventTime.temporalOps at net.opengis.sos.v_1_0_0.GetResult$EventTime at protected java.util.List net.opengis.sos.v_1_0_0.GetResult.eventTime at net.opengis.sos.v_1_0_0.GetResult at public net.opengis.sos.v_1_0_0.GetResult net.opengis.sos.v_1_0_0.ObjectFactory.createGetResult() at net.opengis.sos.v_1_0_0.ObjectFactory

En una aplicación estándar SE, cuando inicializar el JAXBContext como a continuación, todo funciona bien.

JAXBContext context = JAXBContext.newInstance("net.opengis.sos.v_1_0_0:net.opengis.sensorml.v_1_0_1:net.opengis.sos.v_1_0_0.filter.v_1_1_0"); 

¿Cómo configuro los paquetes JAXB en el contexto JAX-WS?

El servidor/entorno de mi aplicación es GF 3.1.

¡Gracias por la ayuda!

Steve

+0

[Este blog] (http://weblogs.java.net/blog/kohlert/archive/2006/10/jaxws_and_type.html) que indica el uso de @XmlSeeAlso en la clase de servicio parece muy prometedor, pero parece que no fue adoptado hasta JAX-WS 2.2. Metro (a través del proyecto JAX-RS RI) parece ser compatible con 2.2 especificaciones ... pero todavía no lo tengo funcionando. Probándolo en GF 3.0.1 ... quizás no tenga una versión compatible de JAX-WS. Intenta más tarde esta noche. Pensamientos, ¿alguien? –

+0

@XmlSeeAlso parecía un buen enfoque, pero no resolvió el problema. Me apuntaron a @UsesJAXBContext, pero parece que el metro tiene un [error] (http://java.net/jira/browse/JAX_WS-270) en el que no llama a createJAXBContext() de JAXBContextFactory I creado, que ha estado abierto durante varios años. La investigación continúa ... –

Respuesta

3

lo tengo trabajando con @UsesJAXBContext -. Tuvo un pequeño problema al principio porque NB 6.9 y 7.0b querían vincular el com.sun.internal * versiones de la UsesJAXBContext y relacionados, que por supuesto no es lo que JAX-WS RI está buscando. Una vez que arreglé estos y agregué la dependencia a jaxws-rt, versión 2.2.3, todo funcionó de maravilla.

@WebService(serviceName = "SOS")//, targetNamespace = "http://www.opengis.net/sos/1.0") 
@UsesJAXBContext(value = SosServices.SosJaxbContext.class) 
//@XmlSeeAlso({net.opengis.sos.v_1_0_0.filter.v_1_1_0.ObjectFactory.class, net.opengis.sensorml.v_1_0_1.ObjectFactory.class}) 
public class SosServices { 

@WebMethod(operationName = "GetResult") 
    public GetResultResponse getResult(GetResult request) { 
     throw new UnsupportedOperationException(); 
    } 

public static class SosJaxbContext implements JAXBContextFactory { 

     @Override 
     public JAXBRIContext createJAXBContext(SEIModel sei, 
       List<Class> classesToBind, List<TypeReference> typeReferences) 
       throws JAXBException { 

      List<Class> classList = new ArrayList<Class>(); 
      classList.addAll(classesToBind); 
      classList.add(TemporalOpsType.class); 

      List<TypeReference> refList = new ArrayList<TypeReference>(); 
      refList.addAll(typeReferences); 
      refList.add(new TypeReference(new QName("http://www.opengis.net/ogc", "temporalOps"), TemporalOpsType.class)); 

      return JAXBRIContext.newInstance(classList.toArray(new Class[classList.size()]), 
        refList, null, sei.getTargetNamespace(), false, null); 
     } 
    } 
} 

Gracias a Aleksei Valikov en la OGC (java.net proyecto) lista de correo para el puntero a @UsesJAXBContext!

Cuestiones relacionadas