为了账号安全,请及时绑定邮箱和手机立即绑定

CXF 消息在拦截器之外的上下文

CXF 消息在拦截器之外的上下文

温温酱 2021-12-22 20:13:27
我正在使用 apache cxf 发送 SOAP 消息,我想要的是在调用完成后获取请求和响应有效负载。目前我正在使用两个拦截器并将有效载荷放入消息的上下文中message.getExchange().put(ExchangeContextEnum.RESPONSE_PAYLOAD.toString(), new String(payload, Charset.forName(StandardCharsets.UTF_8.name())));。我不想在拦截器本身中立即处理它们,因为我需要对一系列调用的请求和响应。此外,为了简单起见,我想避免进行任何类型的存储,而不必处理可能的并发问题。在调用完成或此时上下文完全丢失后,我可以获取这些值吗?一些代码:webService.call(object)//here i'd like to get payloads响应拦截器:public class LogInInterceptor extends AbstractPhaseInterceptor<Message> {public LogInInterceptor() {    super(Phase.RECEIVE);}@Overridepublic void handleMessage(Message message) throws Fault {    InputStream in = message.getContent(InputStream.class);    byte payload[] = new byte[0];    try {        payload = IOUtils.readBytesFromStream(in);    } catch (IOException e) {        e.printStackTrace();    }    ByteArrayInputStream bin = new ByteArrayInputStream(payload);    message.setContent(InputStream.class, bin);    message.getExchange().put(ExchangeContextEnum.RESPONSE_PAYLOAD.toString(), new String(payload, Charset.forName(StandardCharsets.UTF_8.name())));}}请求拦截器:public class WSSLogOutInterceptor extends AbstractSoapInterceptor {public WSSLogOutInterceptor() {    super(Phase.USER_PROTOCOL);}@Overridepublic void handleMessage(SoapMessage message) throws Fault {    try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {        SOAPMessage messageContent = message.getContent(SOAPMessage.class);        messageContent.writeTo(baos);        message.getExchange().put(ExchangeContextEnum.REQUEST_PAYLOAD.toString(), baos.toString());    } catch (SOAPException | IOException e) {        throw new Fault(e);    }}}
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

我最终得到了以下解决方案:


我只是message.put(key, value)在拦截器中进行,而不是将值放入消息交换中。要在调用后获取这些值,您需要获取类似的响应上下文,(String) ((BindingProvider) webService).getResponseContext().get(key)其中key与之前用于将有效负载放入消息中的值相同。现在问题来了——你不会在响应上下文中找到你放在传出链中的值。您可以使用简单的解决方法并将价值放入消息的交换中,然后在传入链中获取它并将其放入消息中。注意我使用的阶段(POST_PROTOCOL),如果你使用 WSS 会很有帮助。


这是代码:


public class LoggingOutPayloadInterceptor extends AbstractSoapInterceptor {


public static final String OUT_PAYLOAD_KEY = "use.your.package.name.OUT_PAYLOAD_KEY";


public LoggingOutPayloadInterceptor() {

    super(Phase.POST_PROTOCOL);

}


@Override

public void handleMessage(SoapMessage soapMessage) throws Fault {


    Document document = soapMessage.getContent(SOAPMessage.class).getSOAPPart();

    StringWriter stringWriter = new StringWriter();

    try {

        TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult(stringWriter));

    } catch (TransformerException e) {

        e.printStackTrace();

    }


    soapMessage.getExchange().put(OUT_PAYLOAD_KEY, stringWriter.toString());

}

}


public class LoggingInPayloadInterceptor extends AbstractSoapInterceptor {


public static final String IN_PAYLOAD_KEY = "use.your.package.name.IN_PAYLOAD";


public LoggingInPayloadInterceptor() {

    super(Phase.POST_PROTOCOL);

    addAfter(SAAJInInterceptor.class.getName());

}


@Override

public void handleMessage(SoapMessage message) throws Fault {

    Document document = message.getContent(SOAPMessage.class).getSOAPPart();

    StringWriter stringWriter = new StringWriter();

    try {

        TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult(stringWriter));

    } catch (TransformerException e) {

        e.printStackTrace();

    }


    message.put(IN_PAYLOAD_KEY, stringWriter.toString());

    message.put(LoggingOutPayloadInterceptor.OUT_PAYLOAD_KEY, message.getExchange().get(LoggingOutPayloadInterceptor.OUT_PAYLOAD_KEY));

}

}


webService.call(...);

String inPayload = (String)((BindingProvider)webService).getResponseContext().get(LoggingInPayloadInterceptor.IN_PAYLOAD_KEY);

String outPayload = (String) ((BindingProvider) webService).getResponseContext().get(LoggingOutPayloadInterceptor.OUT_PAYLOAD_KEY);


查看完整回答
反对 回复 2021-12-22
  • 1 回答
  • 0 关注
  • 157 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号