我正在使用带有 cxf 实现的 jax-ws 来实现 Web 服务。
我有几个使用 @WebService 注释注释的服务。
在不同的包中,我定义了异常(从 RuntimeException 继承)并使用具有唯一命名空间的 @WebFault 注释它们。每个异常类都拥有一个带有异常数据 (faultInfo) 的 bean,该异常数据 (faultInfo) 与故障位于相同的命名空间和包中,并使用 @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;
}
}
故障 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 的命名空间,这就是它失败的原因(它只包含服务和故障)。似乎 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)
谢谢,
阿夫纳