我们在JAX-WS中实现了一组Web服务,并SOAPHandler在SOAP头中添加了控制属性.今天,我们需要@HandlerChain在我们创建的每个新服务中添加注释.
这个想法是新服务实现者不需要知道@HandlerChain存在.
有没有办法配置一个Handler拦截WAR中运行的所有服务的全局?
我正在尝试使用JAX WS为PayPal Express Checkout API实现简单的Web服务客户端.PayPal Express Checkout API提供了WSDL文件,我可以使用CXF的wsdl2java实用程序从中生成Java类.
出于身份验证原因,它需要为每个请求添加SOAP Header.这个标题非常简单,应该如下所示:https: //cms.paypal.com/us/cgi-bin/?cmd = __render-content&content_ID = developer/e_howto_api_ECSOAPAPasics #id09C3I0CF0O6
从WSDL类生成的包括ebay.apis.eblbasecomponents.CustomSecurityHeaderType类,它表示我需要添加到每个请求的标头.
所以问题是:如何考虑以下条件,将手动创建的CustomSecurityHeaderType类实例添加到SOAP请求的标题中:
我希望可以使用某种类型的扩展(尽管我认为我的希望是愚蠢的乐观).
/**
* <p>
* Gets the {@link ResultObject} given the identifier. The following
* fields are not available for some users and will contain a null value:
* </p>
*
* <ul>
* <li>{@code resultObject.comment}</li>
* <li>{@code resultObject.anotherObject.actionById}</li>
* <li>{@code resultObject.anotherObject.actionByName}</li>
* </ul>
*
* <p>
* The {@code daysInPurgatory} value will be {@code -1} when not
* applicable
* </p>
*
* @param requestUser
* the user initiating the request
* @param identifier
* the id of the …Run Code Online (Sandbox Code Playgroud) 虽然这可能看起来像Java Web Services的副本,但我想知道从哪里开始并继续.过去,我花了很多时间来寻找从哪里开始,但我无法做到.在阅读有关Web服务的页面时,有这么多的术语和混乱(至少对我而言!).有很多术语 - 比如JAX-RPC, JAX-WS, Axis, Rest, Servlet as WebService, EJB'sWeb Service和其他我不知道的术语.此用户组是否可以整合并提供易于理解和遵循的Java Web服务的高级概述?感谢您的善意,感谢您的帮助.
我正在使用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) 我从一些现有的wsdl中生成了一些WebServices
我使用Maven来做这个,但是生成了一些web服务
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
Run Code Online (Sandbox Code Playgroud)
和其他人一起
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
Run Code Online (Sandbox Code Playgroud)
Jaxb或xjc会自动执行此操作吗?因为我在wsdls中没有任何差异......
我需要实现一个jax-ws客户端.
以下是提供者文档关于安全性的内容
目前,我们在http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf上使用SOAP Message Security 1.0版规范.
本标准使用另外两个来自W3C规范:
XMLENC(http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/)
和XMLDSIG(http://www.w3.org/TR/2002)/REC-xmldsig-core-20020212 /)对于签名,使用指定X509的"URI"和"valueType"的直接"引用"的"SecurityTokenReference"是强制性的.对于加密,我们也推荐它,但我们也按优先顺序支持对keyIdentifier,X509IssuerSerial或keyName的引用.
加密和签名的块必须是"body"标记.
我们建议使用:"rsa-sha1"用于签名,"rsa-1_5"用于加密密钥,"tripledes-cbc"用于加密正文.
所以我提出了以下政策(从netbeans生成).但是......我看起来并不合适.Web服务尚无法访问,但我不确定规范版本是否匹配.我在这个问题上看了很多,但我仍然有些困惑.这个政策看起来不错吗?
<wsp1:Policy wsu:Id="ListeOperationsPeriodeSoapBindingSoapPolicy">
<wsp1:ExactlyOne>
<wsp1:All>
<sp:TransportBinding>
<wsp1:Policy>
<sp:TransportToken>
<wsp1:Policy>
<sp:HttpsToken RequireClientCertificate="false"/>
</wsp1:Policy>
</sp:TransportToken>
<sp:Layout>
<wsp1:Policy>
<sp:Lax/>
</wsp1:Policy>
</sp:Layout>
<sp:AlgorithmSuite>
<wsp1:Policy>
<sp:TripleDesRsa15/>
</wsp1:Policy>
</sp:AlgorithmSuite>
</wsp1:Policy>
</sp:TransportBinding>
<sp:Wss10/>
<sp:EndorsingSupportingTokens>
<wsp1:Policy>
<sp:X509Token sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
<wsp1:Policy>
<sp:WssX509V3Token10/>
</wsp1:Policy>
</sp:X509Token>
</wsp1:Policy>
</sp:EndorsingSupportingTokens>
</wsp1:All>
</wsp1:ExactlyOne>
</wsp1:Policy>
<wsp:Policy wsu:Id="ListeOperationsPeriodeSoapBindingSoap_perform_Input_Policy">
<wsp:ExactlyOne>
<wsp:All>
<sp1:SignedEncryptedSupportingTokens>
<wsp:Policy>
<sp1:X509Token sp1:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp1:WssX509V3Token10/>
</wsp:Policy>
</sp1:X509Token>
</wsp:Policy>
</sp1:SignedEncryptedSupportingTokens>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
Run Code Online (Sandbox Code Playgroud)
编辑:我无法用wsit发送预期的消息.例如,使用Netbeans向导,如果不使用寻址,我无法获得加密的标头.这应该是可能的吗?
我用一个旧的轴1类和wss4j攻击了一些东西,它有效,但它很难看,而且我宁愿使用更具前瞻性的东西.
我正在为一个相当古老(但可悲的是不可改变的)界面实现一个Web服务.我有一个问题,即调用我的服务的客户端需要SOAP响应中的某个命名空间,并且我很难将其更改为匹配.
考虑一个问候世界的例子,我想要这个:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:helloResponse xmlns:ns2="http://test/">
<return>Hello Catchwa!</return>
</ns2:helloResponse>
</S:Body>
</S:Envelope>
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<customns:helloResponse xmlns:customns="http://test/">
<return>Hello Catchwa!</return>
</customns:helloResponse>
</S:Body>
</S:Envelope>
Run Code Online (Sandbox Code Playgroud)
我找到了类似于我在这里尝试的东西,但是我无法获得类似的代码来正确执行.(我想坚持使用Metro,而不必更改为cxf或轴)
我的实现JAXBContextFactory返回JAXBRIContext如下所示:
import com.sun.xml.bind.api.JAXBRIContext;
import com.sun.xml.bind.api.TypeReference;
import com.sun.xml.ws.api.model.SEIModel;
import com.sun.xml.ws.developer.JAXBContextFactory;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
public class HelloJaxbContext implements JAXBContextFactory
{
@Override
public JAXBRIContext createJAXBContext(SEIModel seim, List<Class> classesToBind, List<TypeReference> typeReferences) throws JAXBException {
List<Class> classList = new ArrayList<Class>();
classList.addAll(classesToBind);
List<TypeReference> refList = new ArrayList<TypeReference>();
for (TypeReference …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?
我为我的客户端Web服务运行wsimport后,构造函数服务(URL,QName,WebServiceFeature [])是未定义的错误.我正在使用JDK 1.6.请帮忙.
