java - services - Excepción JAXB: clase desconocida en este contexto
cxf-codegen-plugin (6)
Este mensaje de error ocurre porque su clase ProfileDto
no está registrada en el Contenido JAXB, o la clase que lo usa no usa @XmlSeeAlso(ProfileDto.class)
para hacer procesable por JAXB.
Sobre tu comentario:
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.
No, también se necesitan cuando no se declaran en el contexto JAXB o, por ejemplo, cuando la única clase que tiene una referencia estática tiene esta referencia anotada con @XmlTransient
. Mantengo un tutorial here .
Cuando llamo a un método de servicio restful en particular, que se crea utilizando CXF , me sale el siguiente error: ¿alguien sabe por qué y cómo resolverlo?
JAXBException ocurrió: class com.octory.ws.dto. ProfileDto ni ninguno de su súper clase es conocido en este contexto ...
A continuación se detallan el método de servicio y los DTO 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;
}
}
ProfileDto:
@XmlRootElement(name="profile")
public class ProfileDto {
...
...
public ProfileDto() { }
...
}
Se corrigió estableciendo el nombre de la clase en la propiedad "classesToBeBound" del JAXB Marshaller:
<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>myclass</value>
</list>
</property>
</bean>
Su clase ProfileDto
no está referenciada en SearchResultDto
. Intente agregar @XmlSeeAlso(ProfileDto.class)
a SearchResultDto
.
Tuve el mismo problema con el arranque de 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;
}
Tuve este error porque registré la clase incorrecta en esta línea de código:
JAXBContext context = JAXBContext.newInstance(MyRootXmlClass.class);
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, la clase ObjectFactory
(referencias de ObjectFactory
a esta clase) contiene métodos SOLAMENTE para un wsdl. Por lo tanto, debe fusionar todos los métodos en una clase ObjectFactory
(para cada WSDL) o generar cada stubs wsdl en directorios diferentes (habrá clases de ObjectFactory
separadas). Resuelve un problema para mí con esta excepción ... J