2010-07-13 65 views
30

Cuando invoco un método de servicio restful en particular, que se genera utilizando CXF, aparece el siguiente error: ¿Alguien sabe por qué y cómo resolverlo?JAXB Excepción: Clase desconocida en este contexto

JAXBException se produjo: clase com.octory.ws.dto. ProfileDto ni ninguna de su superclase que se conoce a este contexto ...

A continuación se presentan el método de servicio y dtos relevantes:

public class Service { 
    public Response results() { 
    Collection<ProfileDto> profilesDto = new ArrayList<ProfileDto>(); 
    ... 
    SearchResultDto srd = new SearchResultDto(); 
    srd.setResultEntities(profilesDto); // Setting profilesDto collection as resultEntities 
    srd.setResultSize(resultSize); 
    return Response.ok(srd).build(); 
    } 
} 

SearchResultDto:

@XmlRootElement(name="searchResult") 
public class SearchResultDto { 
    private Collection resultEntities; 
    private int resultSize; 

    public SearchResultDto() { } 

    @XmlElementWrapper(name="resultEntities") 
    public Collection getResultEntities() { 
     return resultEntities; 
    } 

    public void setResultEntities(Collection resultEntities) { 
     this.resultEntities = resultEntities; 
    } 

    public int getResultSize() { 
     return resultSize; 
    } 

    public void setResultSize(int resultSize) { 
     this.resultSize = resultSize; 
    } 
} 

PerfilD a:

@XmlRootElement(name="profile") 
public class ProfileDto { 
    ... 
    ... 
    public ProfileDto() { } 
    ... 
} 

Respuesta

33

Su clase ProfileDto no se hace referencia en SearchResultDto. Intente agregar @XmlSeeAlso(ProfileDto.class) al SearchResultDto.

+0

Añadiendo @XmlSeeAlso resolvió el problema; Tenía la impresión de que las anotaciones solo eran necesarias cuando la clase a la que se hacía referencia era una subclase. Gracias. – ABK07

+4

¿Qué sucede si la clase es 'SearchResultDto ' donde T es genérico? –

+4

@Hendy Irawan: la anotación también se puede agregar al servicio web en sí (es decir, después de la anotación '@ WebService'). Si está tratando con medicamentos genéricos, tiene más sentido declarar tipos adicionales, ya que en esa etapa debe conocer el conjunto completo de tipos. – CurtainDog

0

Tuve la misma excepción en Tomcat .. Encontré otro problema: cuando uso wsimport sobre el complemento maven para generar stubs para más de 1 WSDLs, clase ObjectFactory (referencias de fragmentos de esta clase) contiene métodos SOLAMENTE para un wsdl. Por lo tanto, debe fusionar todos los métodos en una sola clase ObjectFactory (para cada WSDL) o generar cada stubs wsdl en directorios diferentes (habrá clases ObjectFactory separadas). Se soluciona un problema para mí con este exception..J

24

tuve este error porque he registrado la clase equivocada en esta línea de código:

JAXBContext context = JAXBContext.newInstance(MyRootXmlClass.class); 
3

Este mensaje de error se produce ya sea porque la clase no está registrada ProfileDto en el Contenido JAXB, o la clase que lo usa no usa @XmlSeeAlso(ProfileDto.class) para que JAXB pueda procesarlo.

Sobre su comentario:

Yo tenía la impresión de las anotaciones solamente se necesitaba cuando la clase referenciada era una sub-clase.

No, ellos también son necesarios cuando no declarado en el contexto JAXB o, por ejemplo, cuando la única clase que tiene una referencia estática a que tiene esta referencia anotado con @XmlTransient. Mantengo un tutorial here.

+0

gracias por su tutorial. ¿Debería el "contenido" ser "contextual" en esta respuesta? – djb

2

fija mediante el establecimiento del nombre de la clase a la propiedad "classesToBeBound" del contador de referencias JAXB:

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
     <property name="classesToBeBound"> 
      <list> 
       <value>myclass</value> 
      </list> 
     </property> 
</bean> 
3

tuve el mismo problema con el arranque de la primavera. Se resolvió cuando establecí el paquete en Marshaller.

@Bean 
public Jaxb2Marshaller marshaller() throws Exception 
{ 
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); 
    marshaller.setPackagesToScan("com.octory.ws.dto"); 
    return marshaller; 
} 

@Bean 
public WebServiceTemplate webServiceTemplate(final Jaxb2Marshaller marshaller) 
{ 
    WebServiceTemplate webServiceTemplate = new WebServiceTemplate(); 
    webServiceTemplate.setMarshaller(marshaller); 
    webServiceTemplate.setUnmarshaller(marshaller); 
    return webServiceTemplate; 
} 
Cuestiones relacionadas