我有Spring boot server
,它的工作方式就像proxy
. 它是SOAP service
和SOAP client
。用户在我的服务器上调用肥皂服务,而我的服务器调用另一个肥皂服务。两种服务都使用一个WSDL
. 我的服务器实现了这一点WSDL
并充当客户端的服务器。我的服务器使用它WSDL
来请求另一台服务器并充当另一台服务器的客户端。
Client -> WSDL -> My server -> WSDL -> Another server
| |
|------same WSDL------|
我需要管理 SOAP 日志,但我遇到了问题。例如,我可以添加到 logback 下一行:
<logger name="org.apache.cxf.services.MessageExchangePortType.REQ_IN" level="ERROR" />
<logger name="org.apache.cxf.services.MessageExchangePortType.RESP_IN" level="ERROR" />
<logger name="org.apache.cxf.services.MessageExchangePortType.REQ_OUT" level="INFO" />
<logger name="org.apache.cxf.services.MessageExchangePortType.RESP_OUT" level="INFO" />
但是通过这种方式,我可以管理传入和传出消息的日志。
因为我的服务和客户使用MessageExchangePortType
.
如何管理每个客户端/服务器日志?
这是客户端的实现:
@Bean(name = "MessageExchangeClient")
public MessageExchangePortType signingPortType() {
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean.setServiceClass(MessageExchangePortType.class);
jaxWsProxyFactoryBean.setAddress(host);
jaxWsProxyFactoryBean.getInInterceptors().add(new LoggingInInterceptor());
jaxWsProxyFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
jaxWsProxyFactoryBean.getOutInterceptors().add(new FaultOutInterceptor());
jaxWsProxyFactoryBean.getOutInterceptors().add(new FaultOutInterceptor());
return (MessageExchangePortType) jaxWsProxyFactoryBean.create();
}
这是服务器的实现:
Component
@Slf4j
@SchemaValidation(type = SchemaValidation.SchemaValidationType.IN)
public class MyEndpoint implements MessageExchangePortType {
并在配置中:
@Configuration
public class WebServiceConfiguration {
@Value("${server.path}")
private String path;
private final Bus bus;
private final MyEndpoint myEndpoint;
@Autowired
public WebServiceConfiguration(Bus bus, MyEndpoint myEndpoint) {
this.bus = bus;
this.myEndpoint= myEndpoint;
}
@Bean
Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, myEndpoint);
endpoint.getInInterceptors().add(new SAAJInInterceptor());
LoggingFeature loggingFeature = new LoggingFeature();
loggingFeature.setVerbose(true);
loggingFeature.setLogMultipart(true);
loggingFeature.setPrettyLogging(true);
endpoint.getFeatures().add(loggingFeature);
endpoint.publish(path);
return endpoint;
}
}
例如,我想REQ_IN
在客户端禁用日志并在服务器上启用,但如果我写:<logger name="org.apache.cxf.services.MessageExchangePortType.REQ_IN" level="ERROR" />
我将错误级别设置为客户端和服务器,因为MessageExchangePortType
使用客户端和服务器。