JAXB异常:此上下文不知道的类

ABK*_*K07 36 java web-services cxf jaxb

当我调用使用CXF构建的特定的restful服务方法时,我收到以下错误,有人知道为什么以及如何解决它?

发生JAXBException:类com.octory.ws.dto.ProfileDto也不是它的任何超类都知道这个上下文...

以下是服务方法和相关的DTO:

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();
   }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

ProfileDto:

@XmlRootElement(name="profile")
public class ProfileDto {
    ...
    ...
    public ProfileDto() { }
    ...
}
Run Code Online (Sandbox Code Playgroud)

lex*_*ore 37

您的ProfileDto课程未被引用SearchResultDto.尝试添加@XmlSeeAlso(ProfileDto.class)SearchResultDto.

  • 如果该类是`SearchResultDto <T>`,其中T是通用的,该怎么办? (4认同)
  • @Hendy Irawan - 注释也可以添加到Web服务本身(即在@@ WebService`注释之后).如果你正在处理泛型,那么在那个阶段声明其他类型更有意义,你应该知道完整的类型集. (4认同)

use*_*141 30

我有这个错误,因为我在这行代码中注册了错误的类:

JAXBContext context = JAXBContext.newInstance(MyRootXmlClass.class);
Run Code Online (Sandbox Code Playgroud)


小智 6

我对弹簧靴有同样的问题。当我将包设置为编组器时它解决了。

@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;
}
Run Code Online (Sandbox Code Playgroud)


Jér*_*nge 5

出现此错误消息的原因可能是您的ProfileDto类未在 JAXB 内容中注册,或者使用该类的类无法@XmlSeeAlso(ProfileDto.class)被 JAXB 处理。

关于您的评论:

我的印象是,只有当引用的类是子类时才需要注释。

不,当未在 JAXB 上下文中声明时,或者例如,当唯一具有对其静态引用的类的该引用带有注释时,也需要它们@XmlTransient我在这里维护一个教程。