当我调用使用 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() { }
...
}
答案 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