在与服务命名空间/包不同的命名空间/包中定义WebFault(使用cxf / jax-ws)

时间:2012-07-12 12:44:32

标签: java web-services jax-ws cxf

我正在使用jx-ws和cxf实现来实现Web服务 我有几个使用@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 :(使用package-info将其置于WebServices.MyNamespace命名空间中)

@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)

谢谢,
  阿夫纳

1 个答案:

答案 0 :(得分:0)

它应该可以工作,但尝试强制JAXB使用相同的命名空间设置故障bean的namespace注释的@XmlType属性,如下所示

@XmlType(name = "GeneralRemoteFaultException ", namespace = WebServices.MyNamespace)

此外,您可以强制您的Web服务类使用相同的命名空间设置targetNamespace注释中的属性@WebService,如下所示:

@WebService(name = "myService", targetNamespace =  WebServices.MyNamespace)

如果这不起作用,请添加生成的WSDL以检查命名空间问题。