我们正在开发一个支持Web服务的MDA平台.用户可以在运行时提供WSDL,我们在内部使用JAX-WS生成所有工件(服务器的服务接口和实现,以及客户端的使用者).
我们希望在用户提供的WSDL文档上添加验证.现在,用户必须使用外部工具(如Oxygen,XMLSpy或Web工具)对其进行验证,但我们希望将其添加为系统的一部分.一个很好的功能是模式验证,包括WSDL的嵌入式模式.
在JAX-WS(RI)中,运行时支持模式验证(使用@SchemaValidation批注),但我们没有找到任何对WSDL验证的支持.
我们已经尝试集成Eclipse的WSDL验证器,但它似乎对我们没有用.
有没有办法用JAX-WS做到这一点?如果没有,是否还有其他可以整合的验证框架?
谢谢
我正在使用JAX-WS对基于SOAP的Web服务进行一些研究,我发现了解客户端部分非常复杂.如果有人可以帮我解释一些主题,我会非常感激.我正在使用SOA书籍和Google,但我真的很困惑,所以我想在这里我可以得到更准确的答案,专注于我需要的东西.
因此,我们可以以同步和异步方式与Web服务进行通信.同步通信缺乏双方必须等待,直到处理结束.
异步客户端允许我们使用2种编程模型以异步方式进行通信:1-回调和2-轮询
在谈论异步通信时,我也明白生产者(Web服务)应该有一种方法,一旦处理完成就找到消费者(客户端).这就是为什么我们要解决.
还有一件事.Dispatch API也让我很困惑.因为他们一直在谈论动态客户.
JAX-WS要求传输的所有类都具有默认的构造函数(no-arg构造函数).我不明白这个要求,因为客户端基于WSDL创建自己的类.IMO此要求仅适用于那些用作Webservice输入参数的类.
有谁知道如何规避这一要求?
我想从IBM WebSphere使用.Net WS.
我使用JAX-WS IBM实现创建了一个WS-client,它在IIS上使用.Net WS.客户端在SUSE上,身份验证由NTLM和Windows Server 2003 Active Directory进行.
如果客户端在命令行中执行,则实现调用java.net.Authenticator来获取凭据,并且请求成功.
如果客户端在RAD内执行,则不会调用Authenticator,并且401失败.
如果客户端在WebSphere中执行,则不会调用Authenticator,并且401失败.
如果我直接在.Net WS URL上创建HttpConnection,则会调用Authenticator并且请求成功.
如果不使用JAX-WS IBM实现,我使用Axis2(直接,而不是IBM Axis2 JAX-WS实现),我可以将Authenticator对象传递给Axis2客户端,并且请求是成功的.这仅适用于Windows Server 2003的NTLM协议.当我们迁移到Windows Server 2008时,auth协议是NTLMv2(由于NTLM的安全问题,所有人都转移到NTLMv2)并且请求失败,因为HTTP客户端3不支持NTLMv2. X是Axis2的依赖关系.并且有一段时间他们不会迁移.
如果我使用JAX-WS的其他实现而不是IBM,那么我将失去控制台管理和自动注释读取,以及IBM的支持.
问题
我不明白为什么在RAD内部它不起作用,是从命令行工作的相同程序.
如何使用具有特定凭据的NTLMv2协议支持使JAX-WS IBM实现进行身份验证?(java.net.Authenticator为您提供了这个,它应该被调用...它没有)
是否有任何方法可以使IBM JAX-WS实现使用另一个HTTP客户端而不是标准客户端?
甚至IBM JVM实现也提供了NTLM auth(这就是命令行和直接HttpConnection执行工作的原因)所以我不明白为什么他们不将它用于IBM WS栈.
加分
有没有什么好方法可以通过ActiveDirectory身份验证提供使用WS的双向能力?
评论
Spring WS使用支持NTLMv2 auth的HttpClient 4.X,但我需要一个JAX-WS实现,它应该是IBM的实现.IBM JAX-WS似乎只支持Basic AUTH.我不明白Microsoft WS互操作对IBM来说并不重要.
参考
认证者conf:
提前致谢!
我想知道我是否在jax-ws中使用了泛型方法,例如:
public List<MyCustomClass> getSomething()
Run Code Online (Sandbox Code Playgroud)
jax-ws支持这个吗?在客户端,该方法的返回方式是什么样的?
我使用JAX WS 2.0调用SOAP Web服务.如果出现错误,我收到以下回复:
<?xml version="1.0"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap- envelope">
<soap:Header/>
<soap:Body>
<soap:Fault xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap- envelope" xmlns:xml="http://www.w3.org/XML/1998/namespace">
<soap:Code>
<soap:Value>soap:Receiver</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="en">Exception of type 'blah blah' was thrown.
</soap:Text>
</soap:Reason>
<soap:Node>{SOME URL}</soap:Node>
<detail>
<error>345</error>
<message>Cannot find user. Blah blah</message>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
您可以在详细信息节点中看到有用的错误:
<soap:Envelope>
<soap:Body>
<soap:Fault>
<detail>
Run Code Online (Sandbox Code Playgroud)
在我的客户端,我得到一个SOAPFaultException,它有一个SOAPFault对象.SOAPFault对象似乎缺少我上面发布的节点.SOAPFaultException.getFault().getDetail()为null.但是,它包含所有其他节点,包括soap:Reason.知道为什么它缺少细节节点吗?
谢谢.
我知道如何使用Apache CXF生成客户端存根.但是,当我尝试运行生成的类时,它使用JAXWS.另外,我注意到生成的类的导入类来自javax包.如何使用set生成的类来使用Apache CXF库而不是JAXWS库?
下面是我用来生成客户端存根的代码:
wsdl2java -frontend jaxws21 -wsdlLocation "META-INF/wsdl/WSCustom.wsdl" -client -d C:\Workspace\WSClient\META-INF\wsdl\ "C:\Workspace\WSClient\META-INF\wsdl\WSCustom.wsdl"
Run Code Online (Sandbox Code Playgroud) 一直试图让jax-ws web服务在websphere 8.5中运行但没有成功.我尝试过Java bean和war包装,无状态ejb和jar包装,但它不起作用.
我试图让它与@webservice注释一起工作.
我没有产生任何额外的文物.我让websphere在部署期间搞清楚了.在部署期间没有错误.部署之后,我尝试在浏览器中运行wsdl以查看Web服务是否已成功安装但我什么都没得到.
不确定我在部署期间是否做错了什么.如果您想了解更多信息,请告诉我.
问候,
我创建了Web服务.它工作正常.现在我正在尝试对它进行身份验证.我正在为此目的使用CXF拦截器.由于某种原因,拦截器不会发射.我错过了什么?这是我的第一个网络服务.
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.WebServiceContext;
import org.apache.cxf.interceptor.InInterceptors;
@WebService
@InInterceptors(interceptors = "ws.BasicAuthAuthorizationInterceptor")
public class Service {
@WebMethod
public void test(@WebParam(name = "value") Integer value) throws Exception {
System.out.println("Value = " + value);
}
}
Run Code Online (Sandbox Code Playgroud)
-
package ws;
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.apache.cxf.binding.soap.interceptor.SoapHeaderInterceptor;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
import org.apache.cxf.transport.Conduit;
import org.apache.cxf.ws.addressing.EndpointReferenceType;
public class BasicAuthAuthorizationInterceptor extends SoapHeaderInterceptor {
@Override
public …Run Code Online (Sandbox Code Playgroud) 在创建JAX-WS Web服务时是否有可能更改Webservice URL?
自动URL是(在Glassfish 3上):http://<host>/<context>/<Servicename>但我需要的是:( http://<host>/<context>/axis/services/<Servicename>因为它是从轴到JAX-WS的端口)
有没有办法告诉JAX-WS在哪里发布WS?
使用sun-jaxws.xml是没有选择的,因为它禁用了@ EJB/@Inject DI.