Lorsque j'appelle une méthode de service reposante particulière, qui est construite à l'aide de [~ # ~] cxf [~ # ~] , j'obtiens l'erreur suivante, n'importe qui savez pourquoi et comment le résoudre?
JAXBException s'est produite: la classe com.octory.ws.dto .ProfileDto ni aucune de ses super classes n'est connue dans ce contexte ...
Voici la méthode de service et les DTO pertinents:
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() { }
...
}
Votre classe ProfileDto
n'est pas référencée dans SearchResultDto
. Essayez d'ajouter @XmlSeeAlso(ProfileDto.class)
à SearchResultDto
.
J'ai eu cette erreur car j'ai enregistré la mauvaise classe dans cette ligne de code:
JAXBContext context = JAXBContext.newInstance(MyRootXmlClass.class);
Ce message d'erreur se produit soit parce que votre classe ProfileDto
n'est pas enregistrée dans le contenu JAXB, soit que la classe l'utilisant n'utilise pas @XmlSeeAlso(ProfileDto.class)
pour être traitée par JAXB.
A propos de votre commentaire:
J'avais l'impression que les annotations n'étaient nécessaires que lorsque la classe référencée était une sous-classe.
Non, elles sont également nécessaires lorsqu'elles ne sont pas déclarées dans le contexte JAXB ou, par exemple, lorsque la seule classe ayant une référence statique à celle-ci a cette référence annotée avec @XmlTransient
. Je maintiens un tutoriel ici .
J'ai eu le même problème avec Spring Boot. Il a résolu lorsque j'ai défini le package sur 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;
}
Corrigé en définissant le nom de classe sur la propriété "classesToBeBound" du marshaller JAXB:
<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>myclass</value>
</list>
</property>
</bean>
J'ai eu la même exception sur Tomcat .. J'ai trouvé un autre problème - lorsque j'utilise wsimport sur le plugin maven pour générer des stubs pour plus de 1 WSDL - la classe ObjectFactory
(références de stubs à cette classe) contient des méthodes UNIQUEMENT pour un wsdl . Vous devez donc fusionner toutes les méthodes dans une classe ObjectFactory
(pour chaque WSDL) ou générer chaque stubs wsdl dans différents répertoires (il y aura des classes ObjectFactory
séparées). Cela résout le problème pour moi avec cette exception .. J