2011-04-11 1 views
5

Je crée un service Web SOAP simple à l'aide d'annotations SLSB et JAX-WS . Les objets que je voudrais passer sont JAXB générés à partir de schémas OGC, merci pour le projet OGC sur java.net. Une méthode particulière avec laquelle j'ai des problèmes (qui provoque l'échec du déploiement) est une situation où un champ (eventTime) de l'objet de requête (GetResult) se trouve dans un package différent de l'objet de requête . ObjectFactory pour ce type est différent et est un problème lors du marshalling/unmarshalling.Spécification des packages JAXB dans SLSB et JAX-WS

Un sous-ensemble des erreurs que je reçois:

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

Dans une application standard SE, quand j'initialiser le JAXBContext comme ci-dessous, tout fonctionne 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"); 

Comment définir les packages JAXB dans le contexte JAX-WS?

Mon application serveur/environnement est GF 3.1.

Merci pour l'aide!

Steve

+0

[Ce blog] (http://weblogs.java.net/blog/kohlert/archive/2006/10/jaxws_and_type.html) indiquant que l'utilisation de @XmlSeeAlso sur la classe de service semble très prometteuse, mais elle ressemble n'a pas été adopté avant JAX-WS 2.2. Metro (via le projet JAX-RS RI) semble soutenir la spécification 2.2 ... mais je ne l'ai pas encore fonctionné. Essayer sur GF 3.0.1 ... peut-être qu'il n'a pas une version conforme de JAX-WS. Essayez plus tard ce soir. Pensées, quelqu'un? –

+0

@XmlSeeAussi semblait être une bonne approche, mais n'a pas résolu le problème. J'ai été pointé vers @UsesJAXBContext, mais il semble que metro ait un [bug] (http://java.net/jira/browse/JAX_WS-270) dedans où il n'appelle pas le createJAXBContext() du JAXBContextFactory I créé, ouvert depuis plusieurs années. L'enquête continue ... –

Répondre

3

Je l'ai travailler avec @UsesJAXBContext -. A eu un peu de mal au début parce que NB 6.9 et 7.0b voulaient relier le com.sun.internal * versions du UsesJAXBContext et connexes, ce qui bien sûr ce n'est pas ce que recherche JAX-WS RI. Une fois que j'ai corrigé ces erreurs et ajouté la dépendance à jaxws-rt, la version 2.2.3, tout a très bien fonctionné.

@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); 
     } 
    } 
} 

Merci à Aleksei Valikov sur la liste de diffusion OGC (projet java.net) au pointeur vers @UsesJAXBContext!

Questions connexes