2010-07-13 12 views
30

Quando chiamo un particolare metodo di servizio restful, che viene creato utilizzando CXF, ottengo il seguente errore, qualcuno sa perché e come risolverlo?Eccezione JAXB: Classe non nota in questo contesto

JAXBException: classe com.octory.ws.dto. ProfileDto né della sua classe Super è noto a questo contesto ...

seguito sono il metodo di servizio e DTOs rilevanti:

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

risposta

33

La classe ProfileDto non viene fatto riferimento in SearchResultDto. Prova ad aggiungere @XmlSeeAlso(ProfileDto.class) a SearchResultDto.

+0

L'aggiunta di @XmlSeeAlso ha risolto il problema; Avevo l'impressione che le annotazioni fossero necessarie solo quando la classe di riferimento era una sottoclasse. Grazie. – ABK07

+4

Cosa succede se la classe è 'SearchResultDto ' dove T è generico? –

+4

@Hendy Irawan - L'annotazione può anche essere aggiunta al servizio Web stesso (ad esempio dopo l'annotazione '@ WebService'). Se hai a che fare con i generici, ha più senso dichiarare tipi addizionali, poiché in quella fase dovresti conoscere l'intera serie di tipi. – CurtainDog

0

Ho avuto la stessa eccezione su Tomcat .. Ho trovato un altro problema - quando uso wsimport su Maven plugin per generare stub per più di 1 WSDL - la classe ObjectFactory (riferimenti stub a questa classe) contiene metodi SOLO per uno wsdl. Quindi dovresti unire tutti i metodi in una classe ObjectFactory (per ogni WSDL) o generare ogni stub wsdl in diverse directory (ci saranno classi separate ObjectFactory). Si risolve problema per me con questo exception..J

24

ho avuto questo errore perché ho registrato la classe sbagliata in questa riga di codice:

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

Questo messaggio di errore accade sia perché la classe ProfileDto non è registrato nel contenuto JAXB, o la classe che lo usa non usa @XmlSeeAlso(ProfileDto.class) per renderlo processabile da JAXB.

Circa il tuo commento:

ho avuto l'impressione le annotazioni era necessario solo quando la classe di riferimento era una sottoclasse.

No, sono necessari anche se non dichiarati nel contesto JAXB o, ad esempio, quando l'unica classe con un riferimento statico ad esso ha questo riferimento annotato con @XmlTransient. Mantengo un tutorial here.

+0

grazie per il tuo tutorial. Il "contenuto" dovrebbe essere "contesto" in questa risposta? – djb

2

fisso impostando il nome della classe per la proprietà "classesToBeBound" del marshaller JAXB:

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

Ho avuto lo stesso problema con avvio di primavera. È stato risolto quando ho impostato il pacchetto su 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; 
} 
Problemi correlati