gpt4 book ai didi

java - Java Web 服务中的 Soap 信封命名空间前缀

转载 作者:行者123 更新时间:2023-11-30 08:51:17 26 4
gpt4 key购买 nike

我正在尝试更改 soap 信封的前缀以响应来自S="http://schemas.xmlsoap.org/soap/envelope/"到soap="http://schemas.xmlsoap.org/soap/envelope/":

现在的响应是这样的:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<n:soaprequestResponse xmlns:n="http://tempuri.org/soaprequest">
<n:soaprequestResult/>
</n:soaprequestResponse>
</S:Body>
</S:Envelope>

它看起来应该是这样的:

<soap:Envelope xmlns:soap:="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<n:soaprequestResponse xmlns:n="http://tempuri.org/soaprequest">
<n:soaprequestResult/>
</n:soaprequestResponse>
</soap:Body>
</soap:Envelope>

如何实现?

编辑:

我添加了 soap 处理程序类,当我尝试获取信封时问题开始了:

package org.tempuri.soaprequest;

import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;


public class SoapHandler implements SOAPHandler<SOAPMessageContext> {

@Override
public Set<QName> getHeaders() {
//do nothing
return null;
}

@Override
public boolean handleMessage(SOAPMessageContext context) {
if ((boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)) { //Check here that the message being intercepted is an outbound message from your service, otherwise ignore.
try {
SOAPEnvelope msg = context.getMessage().getSOAPPart().getEnvelope(); //just trying to get envelope
} catch (SOAPException ex) {
ex.printStackTrace();
}

return true; //indicates to the context to proceed with (normal)message processing
}

@Override
public boolean handleFault(SOAPMessageContext context) {
//do nothing
return true;
}

@Override
public void close(MessageContext context) {
//do nothing

}
}

SoapUI 抛出:

<S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
<faultcode>S:Server</faultcode>
<faultstring>JVMVRFY012 stack shapeinconsistent;class=com/sun/xml/messaging/saaj/soap/SOAPDocumentImpl, method=createDocumentFragment()Lorg/w3c/dom/DocumentFragment;, pc=5
</faultstring>
</S:Fault>

Tomcat日志没有错误。

如果没有自定义 soap 处理程序,它不会发生。

也许原因在于我实现网络方法的方式。它创建一个新线程,其中包含一个处理请求的对象,然后返回空响应,从而使客户端不再等待请求处理结束:

@WebResult(name="soaprequestResult", targetNamespace="http://tempuri.org/soaprequest")
public SoaprequestResponse.SoaprequestResult soaprequest(@WebParam(name="streams", targetNamespace="http://tempuri.org/soaprequest") SoaprequestStreams streams) {
try {
new Thread(new MyProcess(streams)).start();
return new SoaprequestResponse().getSoaprequestResult();
} catch(Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String stackTrace = sw.toString();
return new SoaprequestResponse().getSoaprequestResult();
}
}

而 MyProcess 是真正进行请求处理并执行 stmt.executeUpdate 的类。

最佳答案

我认为Customising JAX-WS prefix of a SOAP response总结了您的选择。

选项 1:我认为您只需要将其放在包裹上方即可。

@javax.xml.bind.annotation.XmlSchema(namespace = "http://schemas.xmlsoap.org/soap/envelope/",
xmlns = {
@javax.xml.bind.annotation.XmlNs(prefix = "soap",
namespaceURI="http://schemas.xmlsoap.org/soap/envelope/")
}
)

选项 2:或者(也在链接中提到),您可以使用 SOAPHandler 。您可以添加一个配置文件来绑定(bind)这些处理程序。但实际上,您可以在运行时添加它们。我认为这需要一些解释:诀窍是获取 BindingProvider 的实例。 .如果您是网络服务的消费者或提供者,则情况有所不同。

如果您是服务器(即提供网络服务):

webservice = Class.forName(serviceClassName).newInstance();
Endpoint e = Endpoint.create(webservice);
BindingProvider bp = (BindingProvider)e.getBinding();
e.publish("http://localhost:" + serverPort + servicePath);

如果您是客户端(即使用网络服务):

Service service = new Service(url, qname);
Port port = service.getPort();
BindingProvider bp = ((BindingProvider) port);

当您拥有绑定(bind)提供程序时,您可以按如下方式绑定(bind)处理程序。

List<Handler> chain = bp.getHandlerChain();
if (chain == null) chain = new ArrayList<Handler>();
chain.add(myCustomHandler);
bp.setHandlerChain(chain);

现在,对于链式处理程序本身,您应该实现 SOAPHandler<SOAPMessageContext> .在那里你可以随心所欲地处理你的信息。 (有关示例,请参见上面的链接帖子)。

关于java - Java Web 服务中的 Soap 信封命名空间前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30623419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com