web-dev-qa-db-fra.com

Exception JAXB: classe non connue dans ce contexte

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() { }
    ...
}
36
ABK07

Votre classe ProfileDto n'est pas référencée dans SearchResultDto. Essayez d'ajouter @XmlSeeAlso(ProfileDto.class) à SearchResultDto.

37
lexicore

J'ai eu cette erreur car j'ai enregistré la mauvaise classe dans cette ligne de code:

JAXBContext context = JAXBContext.newInstance(MyRootXmlClass.class);
29
user64141

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 .

3

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;
}
3
hacker13ua

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>
2
Monica

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

0
Slava