Ответ 1
Ваш класс ProfileDto
не указан в SearchResultDto
. Попробуйте добавить @XmlSeeAlso(ProfileDto.class)
в SearchResultDto
.
Когда я вызываю какой-либо особый метод обслуживания, который построен с использованием CXF, я получаю следующую ошибку: кто-нибудь знает, почему и как ее решить?
JAXBException произошло: class com.octory.ws.dto. ПрофильDto, ни любой его суперкласс известен этому контекст...
Ниже приведены метод обслуживания и соответствующие 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() { }
...
}
Ваш класс ProfileDto
не указан в SearchResultDto
. Попробуйте добавить @XmlSeeAlso(ProfileDto.class)
в SearchResultDto
.
У меня была эта ошибка, потому что я зарегистрировал неправильный класс в этой строке кода:
JAXBContext context = JAXBContext.newInstance(MyRootXmlClass.class);
Это сообщение об ошибке происходит либо потому, что ваш класс ProfileDto
не зарегистрирован в содержимом JAXB, либо класс, использующий его, не использует @XmlSeeAlso(ProfileDto.class)
для выполнения процесса JAXB.
О комментариях:
У меня было впечатление, что аннотации нужны только когда ссылочный класс был подклассом.
Нет, они также необходимы, если они не объявлены в контексте JAXB или, например, когда единственный класс, имеющий статическую ссылку на него, имеет эту ссылку, аннотированную с помощью @XmlTransient
. Я поддерживаю учебник здесь.
У меня была такая же проблема с загрузкой spring. Он разрешил, когда я установил пакет в 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;
}
Исправлено его, установив имя класса в свойство "classesToBeBound" маршаллера JAXB:
<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>myclass</value>
</list>
</property>
</bean>
У меня было то же исключение на Tomcat.. Я нашел другую проблему - когда я использую wsimport над плагином maven для создания заглушек для более чем 1 WSDLs - class ObjectFactory
(ссылки на заглушки на этот класс) содержит методы ТОЛЬКО для одного wsdl, Таким образом, вы должны объединить все методы в один класс ObjectFactory
(для каждого WSDL) или сгенерировать каждый кусок wsdl в разных каталогах (будут разделены классы ObjectFactory
). Это решает проблему для меня с этим исключением..J