【问题标题】:CXF custom validation and FaultOutInterceptors for manage Errors用于管理错误的 CXF 自定义验证和 FaultOutInterceptors
【发布时间】:2014-03-10 12:12:51
【问题描述】:

我使用 cxf 开发了一个 Web 服务。如果由于请求不遵守关联的 xsd 架构而导致错误,我将自定义发送给客户端的错误。为此:

1- 我在 web-services.xml 中添加了一个特定的 EventHandlerValidator 和一个特定的 FaultOutInterceptor

<jaxws:endpoint id="getNewCustomerOrderId" implementor="#getNewCustomerOrderIdWS" address="/GetNewCustomerOrderId">
    <jaxws:properties>
        <entry key="jaxb-validation-event-handler">
            <ref bean="getNewCustomerOrderIdEventHandlerValidator"/>
        </entry>
        <entry key="schema-validation-enabled" value="IN"/>
        <entry key="set-jaxb-validation-event-handler" value="true"/>
    </jaxws:properties>
    <jaxws:outFaultInterceptors>
        <ref bean="getNewCustomerOrderIdCXFFaultOutInterceptor"/>
    </jaxws:outFaultInterceptors>
</jaxws:endpoint>`enter code here

2 - 我已经实现了这些类:

在 handleValidator 中,我只是用代码和消息抛出我自己的异常

public class GetNewCustomerOrderIdEventHandlerValidator implements ValidationEventHandler {

@Override
public boolean handleEvent(ValidationEvent event) {
    throw new MyException(MyExceptionCode.ERCC_GNCOI_100, event.getMessage());

}

}

FaultExceptionInterceptor 针对 web 服务调用期间抛出的每个异常运行。我只想用代码 ERCC_GNCOI_100 捕获 MyException 来自定义它,所以:

public class GetNewCustomerOrderIdCXFFaultOutInterceptor extends AbstractSoapInterceptor {

private static final Logger LOGGER = LoggerFactory.getLogger(CreateCustomerOrderCXFFaultOutInterceptor.class);

@Inject
private CreateCustomerOrderFaultExceptionService createCustomerOrderFaultExceptionService;

private static final JAXBContext jaxbContext;

static {
    try {
        jaxbContext = JAXBContext.newInstance(CreateCustomerOrderException.class);
    } catch (JAXBException e) {
        LOGGER.error(CormoranMarker.TECH, "Error during JAXBContext instantiation");
        throw new RuntimeException(e);
    }
}

public GetNewCustomerOrderIdCXFFaultOutInterceptor() {
    super(Phase.MARSHAL);
}


@Override
public void handleMessage(SoapMessage message) throws Fault {
    Fault exceptionFault = (Fault) message.getContent(Exception.class);
    exceptionFault.setMessage("My custom message");
    if (exceptionFault.getCause() instanceof MyException) {
        MyException myException = (MyException) exceptionFault
                .getCause();

        if (myException.getCode().equals(myException.ERCC_GNCOI_100)) {// validation
                                                                                                            // schema
                                                                                                            // errors
            Element elt = buildExceptionFaultDetail(cormoranFunctionalException);
            exceptionFault.setDetail(elt);
        }

    }

}

private Element buildExceptionFaultDetail(CormoranFunctionalException cormoranFunctionalException) {
    // Build custom response

}

}

但是,在拦截器中我无法捕捉到我的异常:

Fault exceptionFault = (Fault) message.getContent(Exception.class);

这一行得到一个解组异常:

Unmarshalling Error: cvc-complex-type.2.4.a: Invalid content was found starting with element 'customerOrderType1'. One of '{customerOrderID, version, customerOrderType, depositDate}' is expected. 

在日志中我看到我的异常已被抛出:

12:32:27.338 [qtp200426125-38] ERROR c.o.c.c.e.MyException - [] - MyException : Non-respect du schéma (XSD) du WebService exposé par Cormoran : cvc-complex-type.2.4.a: Invalid content was found starting with element 'customerOrderType1'. One of '{customerOrderID, version, customerOrderType, depositDate}' is expected.

你能帮帮我吗?

提前谢谢你!

奥里

【问题讨论】:

  • 嗨,你能分享更新的项目吗?如果您分享它对我有用,我将面临同样的问题。邮件 ID 是 rangareddy.avula@gmail.com

标签: cxf


【解决方案1】:

Interceptor 有两个问题。

首先,您需要在进行更改后将新内容设置为消息。为此,您可以在代码之后将以下内容添加到 handleMessage 方法

message.setContent(Exception.class, exceptionFault);

其次,您选择的阶段来不及对 Fault 对象进行更改。看起来PRE_STREAM 是允许更改的最新阶段。 CXF Interceptor documentation 有完整的阶段列表。

【讨论】:

    【解决方案2】:

    您可以如下修改消息。

    Fault exceptionFault = (Fault) message..getExchange().getContent(Exception.class);
    

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多