系统属性System.getProperties()和JVM中的环境变量System.getenv()有什么区别?
如果有任何错误,我想记录原始肥皂邮件请求,我正在使用JAX-WS.任何帮助将不胜感激.
只有在响应中发生异常时,是否有一种简单的方法(也就是说:不使用代理)来访问使用JAX-WS参考实现(JDK 1.5中包含的那个)更好的Web服务的原始请求/响应XML?我想记录原始的SOAP reuest,以便我可以在以后的任何webservice客户端测试它
我正在使用JAX-WS参考实现(2.1.7),我想在客户端跟踪SOAP请求/响应.实际上,我需要的是在收到响应时检查一些Http头.
按照以前的问题(使用JAX-WS和Java JAX-WS Web服务客户端跟踪XML请求/响应:如何记录日志请求和响应xml?),我创建了自己的处理程序,以便在发送请求和接收请求时进行记录响应:
public class SHandler implements SOAPHandler<SOAPMessageContext>
{
private static final Logger log = Logger.getLogger(SHandler.class);
@Nullable
@Override
public Set<QName> getHeaders()
{
log.debug(">>>>>>>>>>> GetHeaders");
return null;
}
@Override
public boolean handleMessage(SOAPMessageContext soapMessageContext)
{
log.debug(">>>>>>>>>>> HandleMessage");
return true;
}
@Override
public boolean handleFault(SOAPMessageContext soapMessageContext)
{
log.debug(">>>>>>>>>>> HandleFault");
return true;
}
@Override
public void close(MessageContext messageContext)
{
log.debug(">>>>>>>>>>> Close");
}
}
Run Code Online (Sandbox Code Playgroud)
我在服务初始化期间将处理程序添加到处理程序链:
@WebServiceClient(name = "MyService", targetNamespace = "http://www.whatever.com/", wsdlLocation = "file:/path/to/wsdl")
public class …Run Code Online (Sandbox Code Playgroud) 我创建了该实现的LoggingHandler实现SOAPHandler<SOAPMessageContext>
它应该在每次handleMessage触发时记录(在我的情况下从不调用它)
MyService service = new MyService();
MyServicePort port = service.getPortType();
Run Code Online (Sandbox Code Playgroud)
现在我试试这个:
BindingProvider bindingProvider = (BindingProvider)port;
bindingProvider.getBinding().getHandlerChain().add(new LoggingHandler());
Run Code Online (Sandbox Code Playgroud)
我没有看到任何请求/响应xml.
你能建议任何解决方案吗?也许有另一种方式来查看输出和请求XML?
我有来自oracle的NO-.net webservice要访问我需要添加soap标头.如何在java中添加soap标头?
Authenticator.setDefault(new ProxyAuthenticator("username", "password"));
System.getProperties().put("proxySet", "true");
System.setProperty("http.proxyHost", "IP");
System.setProperty("http.proxyPort", "port");
proxy = new RegPresMed_Service(new URL("webservice")).getRegPresMed();
((BindingProvider) proxy).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "realwebservice");
((BindingProvider) proxy).getRequestContext().put("com.sun.xml.ws.request.timeout", new Integer(60000));
((BindingProvider) proxy).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "webserviceUsername");
((BindingProvider) proxy).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "webservicePassword");
Run Code Online (Sandbox Code Playgroud)
这有必要吗?
((BindingProvider) proxy).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "webserviceUsername");
((BindingProvider) proxy).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "webservicePassword");
Run Code Online (Sandbox Code Playgroud)
我的肥皂标题是这样的:
<wsse:Security soapenv:mustUnderstand="1"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-6"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>username</wsse:Username>
<wsse:Password
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
<wsse:Nonce
EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">randomnaumber==</wsse:Nonce>
<wsu:Created>dateCreated</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
Run Code Online (Sandbox Code Playgroud) 我正在尝试将使用Metro堆栈发送的消息记录到控制台中.找不到任何办法.
一直在寻找和测试。
到目前为止我发现了什么:
- 处理程序.. 将soap 消息作为原始xml 输出到控制台输出这是非常好的解决方案。但是,对于HTTP标头(使用MimeHeaders),输出似乎太少了。例如在客户端我只得到
Accept : text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Type : text/xml; charset=utf-8
Content-Length : 260
Run Code Online (Sandbox Code Playgroud)
- 系统属性
System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.ws.util.pipe.StandaloneTubeAssembler.dump", "true");
System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true");
Run Code Online (Sandbox Code Playgroud)
这是完美的输出到控制台、完整的 http 标头和肥皂消息。但不能自定义用于日志记录、操作标题/消息。这是一个示例
---[HTTP request - http://localhost:8080/Testmart/TestMartCatalogService]---
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getProducts xmlns:ns2="http://www.testmart.com"><arg0>books</arg0></ns2:getProducts></S:Body></S:Envelope>--------------------
---[HTTP response - http://localhost:8080/Testmart/TestMartCatalogService - …Run Code Online (Sandbox Code Playgroud) 我使用JAX-WS RI进行SOAP XML与其他服务的交换.我试图看到我的soap xml发送的完整错误日志,但由于截断消息而无法执行此操作:
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171)
at org.apache.cxf.transpo
Message has been truncated
use com.sun.xml.ws.transport.http.HttpAdapter.dumpTreshold property to increase the amount of printed part of the message
--------------------
Run Code Online (Sandbox Code Playgroud)
我无法使用以下设置更正此问题:
System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dumpTreshold", "999999");
Run Code Online (Sandbox Code Playgroud)
我的意思是dumpTreshold = 999999
任何帮助将不胜感激.
java ×6
jax-ws ×5
web-services ×5
soap ×2
client ×1
environment ×1
http-headers ×1
jakarta-ee ×1
logging ×1
properties ×1
soapheader ×1
system ×1
variables ×1
ws-security ×1
xml ×1