[〜#〜] cxf [〜#〜]を使用して構築された特定の落ち着いたサービスメソッドを呼び出すと、次のエラーが発生します。それを解決する理由と方法を知っていますか?
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();
}
}
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
で参照されていません。 SearchResultDto
に@XmlSeeAlso(ProfileDto.class)
を追加してみてください。
このコード行で間違ったクラスを登録したため、このエラーが発生しました。
JAXBContext context = JAXBContext.newInstance(MyRootXmlClass.class);
このエラーメッセージは、ProfileDto
クラスがJAXBコンテンツに登録されていないか、それを使用するクラスが@XmlSeeAlso(ProfileDto.class)
を使用してJAXBで処理できないために発生します。
コメントについて:
私は、参照されたクラスがサブクラスである場合にのみ注釈が必要であるという印象を受けていました。
いいえ、JAXBコンテキストで宣言されていない場合や、静的な参照を持つ唯一のクラスにこの参照が@XmlTransient
アノテーションが付けられている場合にも必要です。チュートリアル here を管理しています。
スプリングブーツでも同じ問題がありました。パッケージをマーシャラーに設定すると解決しました。
@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;
}
クラス名をJAXBマーシャラーのプロパティ "classesToBeBound"に設定することで修正しました。
<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>myclass</value>
</list>
</property>
</bean>
Tomcatでも同じ例外がありました。別の問題が見つかりました-Mavenプラグインでwsimportを使用して複数のWSDLのスタブを生成すると-クラスObjectFactory
(このクラスへのスタブ参照)には1つのwsdlのみのメソッドが含まれます。したがって、すべてのメソッドを1つのObjectFactory
クラスに(WSDLごとに)マージするか、異なるディレクトリに各wsdlスタブを生成する必要があります(個別のObjectFactory
クラスがあります)。私はこの例外で問題を解決します。