Web サービスを実装するために cxf 実装で jax-ws を使用しています。
@WebService アノテーションが付けられたサービスがいくつかあります。
別のパッケージで例外 (RuntimeException から継承) を定義し、一意の名前空間を持つ @WebFault で注釈を付けました。各例外クラスは、例外データ (faultInfo) を持つ単一の Bean を保持します。これは、障害と同じ名前空間およびパッケージに存在し、@XMlType で注釈が付けられます。
例:
障害クラス:
@WebFault(name = "GeneralRemoteFault", targetNamespace = WebServices.MyNamespace)
public class GeneralRemoteFault extends RuntimeException
{
private GeneralRemoteFaultException faultInfo;
public GeneralRemoteFault(String message, GeneralRemoteFaultException faultInfo) {
super(message);
this.faultInfo = faultInfo;
}
public GeneralRemoteFault(String message, GeneralRemoteFaultException faultInfo, Throwable cause) {
super(message, cause);
this.faultInfo = faultInfo;
}
public GeneralRemoteFaultException getFaultInfo() {
return faultInfo;
}
}
Fault Bean: (WebServices.MyNamespace 名前空間に配置する package-info を使用)
@XmlType(name = "GeneralRemoteFaultException ")
public class GeneralRemoteFaultException
{
private String objId;
public GeneralRemoteFaultException () {}
public GeneralRemoteFaultException (String objId)
{
this.objId = objId;
}
public String getObjId()
{
return objId;
}
public void setObjId(String objId)
{
this.objId = objId;
}
}
サービス方法:
List<ValidationErrors> validateObject(
@WebParam(name = "object") ValidationObject object,
@WebParam(name = "groups") String[] groups) throws GeneralRemoteFault;
サーバー CXF を実行すると、次のエラーが表示されます。
ERROR org.apache.cxf.service.factory.ReflectionServiceFactoryBean.fillInSchemaCrossreferences:305
[main] - Schema element {http://www.example.com/schema}ValidationRemoteFault references undefined type
{http://www.example.com/schema}ValidationRemoteFaultException for service {http://web_services.example.com/}ValidationService
サービスを実行するコードをデバッグした後、スキーマ コレクション (XmlSchemaCollection.schemas) にフォールト Bean の名前空間が含まれていないことに気付きました。それが失敗する理由です (サービス 1 とフォールト 1 のみが含まれています)。CXF は、フォールト Bean が他の名前空間とは別の名前空間で定義されるというオプションを考慮しておらず、フォールト Bean スキーマをスキーマ コレクションにロードしていないようです。フォルト Bean をフォルトと同じ名前空間 (上記で定義) にまとめたとしても、名前空間のスキーマ (XmlSchema) には JAXB 型は含まれず、フォルトのみが含まれます。
エラーの解決に関する洞察をいただければ幸いです。
これは、メッセージがポップされる場所のスタックです。
at org.apache.ws.commons.schema.XmlSchemaCollection.getTypeByQName(XmlSchemaCollection.java:229)
at org.apache.cxf.common.xmlschema.SchemaCollection.getTypeByQName(SchemaCollection.java:109)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.fillInSchemaCrossreferences(ReflectionServiceFactoryBean.java:301)
at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:269)
- locked <0x1670> (a org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean)
at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:205)
at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:159)
at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:207)
at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:442)
- locked <0x1678> (a org.apache.cxf.jaxws22.EndpointImpl)
at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:329)
at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:246)
ありがとう、
アヴナー