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

时间:2010-07-13 13:12:00

标签: java web-services jaxb cxf

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

  

发生了JAXBException:class   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();
   }
}

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

6 个答案:

答案 0 :(得分:36)

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

答案 1 :(得分:28)

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

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

答案 2 :(得分:3)

发生此错误消息是因为您的ProfileDto类未在JAXB内容中注册,或者使用它的类不使用@XmlSeeAlso(ProfileDto.class)来使JAXB可以处理。

关于您的评论:

  

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

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

答案 3 :(得分:3)

我在弹簧靴方面遇到了同样的问题。当我将包设置为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;
}

答案 4 :(得分:2)

通过将类名设置为属性&#34; classesToBeBound&#34;来修复它。 JAXB marshaller:

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

答案 5 :(得分:0)

我在Tomcat上遇到了同样的异常..我发现了另一个问题 - 当我使用wsimport over maven plugin为超过1个WSDL生成存根时 - 类ObjectFactory(对此类的存根引用)仅包含方法一个wsdl。因此,您应该合并一个ObjectFactory类中的所有方法(对于每个WSDL),或者在不同的目录中生成每个wsdl存根(将有ObjectFactory个类别)。它解决了这个例外的问题...... J