我需要为后端使用旧式RPC /编码的WSDL Web服务.起初我尝试使用Apache CXF和JAX-WS,但JAX-WS wsimport工具不使用rpc/enoded WSDL.
[错误] JAXWS 2.0不支持rpc/encoded wsdls.
我也对使用JAX-RPC做这项工作有疑问,因为它已经过时了.Axis 1.4是5年的工具.
目前我看到这三个选项:
javax.xml.ws.Dispatch来发送和接收SOAP和某种方式解析它,一个例子这些都听起来不太好,所以如果你能提供一些好的线索,想要做什么以及如何解决它,我将不胜感激.
我有一个第三方jar,它附带一个jaxb-impl.jar并将其包含在其manifest类路径中.问题是,似乎提供自己的JAXB版本(无论它是哪个版本)似乎打破了JAX-WS中的SoapFaultBuilder.
根据非官方的JAXB指南,似乎Sun在将JAXB折叠到JDK中时故意更改了包名称,以避免与独立版本冲突.但是,随JDK一起提供的SoapFaultBuilder(我相信JAX-WS的一部分)明确依赖于新的内部包名.如果您添加了一个独立的JAXB jar(即使它与JAXB的版本号相同),这会在构建错误消息时导致失败.
这是我的小测试案例:我制作一个简单的Web服务:
package wstest;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface HelloWorld{
@WebMethod String getHelloWorldAsString(String name);
}
Run Code Online (Sandbox Code Playgroud)
一个简单抛出异常的实现.(因为问题只出现在SOAPFaultBuilder中):
package wstest;
import javax.jws.WebService;
//Service Implementation
@WebService(endpointInterface = "wstest.HelloWorld")
public class HelloWorldImpl implements HelloWorld{
@Override
public String getHelloWorldAsString(String name) {
//return "Hello World JAX-WS " + name;
throw new RuntimeException("Exception for: " + name);
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个发布Web服务的类:
package wstest;
import javax.xml.ws.Endpoint;
//Endpoint publisher
public class HelloWorldPublisher{ …Run Code Online (Sandbox Code Playgroud) 我正在学习如何使用Java开发SOAP Web服务.
到目前为止,我一直在关注这个优秀的教程
一切顺利,我的Web服务通过命令行与它的嵌入式服务器一起工作,然后在NetBeans的帮助下我将它部署在Tomcat上.
我想知道在Tomcat上手动部署它的步骤,以了解它是如何完成的,因为我不喜欢依赖于IDE.
我的意思是,我想知道如何通过命令行和文本编辑器完成所有工作.
我还发现这个链接解释了如何手动将servlet部署到Tomcat,
http://linux-sxs.org/internet_serving/c292.html
但我找不到任何有关如何部署Web服务的文章.
非常感谢.
是否可以同时运行单个@WebService bean作为安全和不安全的方式,最好使用除http/https协议差异之外的相同URL?
我可以使用以下方法运行安全或不安全的服务:
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
Run Code Online (Sandbox Code Playgroud)
要么
<transport-guarantee>NONE</transport-guarantee>
Run Code Online (Sandbox Code Playgroud)
在sun-ejb-jar.xml里面
IE浏览器.
<ejb>
<ejb-name>MyEJB</ejb-name>
<webservice-endpoint>
<port-component-name>MyWebService</port-component-name>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</webservice-endpoint>
</ejb>
Run Code Online (Sandbox Code Playgroud)
建议?
我正在尝试创建一个独立的客户端来使用一些Web服务.我必须将我的用户名和密码添加到SOAP Header中.我尝试添加凭据如下:
OTSWebSvcsService service = new OTSWebSvcsService();
OTSWebSvcs port = service.getOTSWebSvcs();
BindingProvider prov = (BindingProvider)port;
prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "myusername");
prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "mypassword");
...
Run Code Online (Sandbox Code Playgroud)
当我在服务上调用方法时,我得到以下异常:
com.ibm.wsspi.wssecurity.SoapSecurityException: WSEC5048E: One of "SOAP Header" elements required.
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我如何将这些属性添加到SOAP标头?
编辑:我使用的是JDK6中包含的JAX-WS 2.1.我现在正在使用JAX-WS 2.2.我现在得到以下异常:
com.ibm.wsspi.wssecurity.SoapSecurityException: WSEC5509E: A security token whose type is [http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken] is required.
Run Code Online (Sandbox Code Playgroud)
我该如何创建此令牌?
由于WS客户端服务和端口的初始化需要很长时间,所以我喜欢在启动时初始化它们并重用相同的端口实例.初始化看起来像这样:
private static RequestContext requestContext = null;
static
{
MyService service = new MyService();
MyPort myPort = service.getMyServicePort();
Map<String, Object> requestContextMap = ((BindingProvider) myPort).getRequestContext();
requestContextMap = ((BindingProvider)myPort).getRequestContext();
requestContextMap.put(BindingProvider.USERNAME_PROPERTY, uName);
requestContextMap.put(BindingProvider.PASSWORD_PROPERTY, pWord);
rc = new RequestContext();
rc.setApplication("test");
rc.setUserId("test");
}
Run Code Online (Sandbox Code Playgroud)
我班上某个地方的电话:
myPort.someFunctionCall(requestContext, "someValue");
Run Code Online (Sandbox Code Playgroud)
我的问题:这个调用是否是线程安全的?
在此之前,我想让您知道我已经可以连接到Web服务服务器了.我问这个问题是因为我希望深入了解wsimport生成的客户端是如何工作的.根据我的研究,wsimport使用JAXWS.请注意,我不了解JAXWS.
我使用wsimport生成了我的客户端.我使用的WSDL来自Axis2 Web服务,由Axis2自动生成.下面的类是wsimport的结果:
下 com.datamodel.xsd
DataBeanRequest.javaDataBeanResponse.javaObjectFactory.javapackage-info.java下 com.service
MyWebService.javaMyWebServicePortType.javaMyMethod.javaMyMethodResponse.javaObjectFactory.javapackage-info.java使用上面的类,我可以告诉它com.datamodel.xsd包含Web服务服务器使用的bean(不包括ObjectFactory和package-info).同时,MyMethod和MyMethodResponse也用于设置的web服务方法/操作的请求和响应参数豆.
以下是我的问题:(如果你不知道我的一些问题的答案,你真的不必回答所有问题.:)请随时分享你认为我可能会觉得有用的任何信息.)
我是否正确
MyWebService,它包含一个注释,指的是我用来生成客户端的WSDL的绝对位置.wsdllocation在客户端中指定的相关性是什么?客户如何使用该信息?wsimport命令有一个wsdllocation属性,其中wsdllocation可以指定值.)我们使用"从Java开始"方法使用Metro 1.5堆栈创建JAX-WS 2.0 Web服务.当我们在其中一个Web服务上指向SoapUI等标准工具时,它表明WebMethods的参数是可选的.生成的xsd显示minOccurs = 0.
我需要一种方法来使"从Java开始"方法中需要WebMethod参数(在xsd中可能是minOccurs = 1).我认为这有一个Java注释,但我找不到一个.XmlElement注释具有必需属性,但XmlElement不能应用于WebMethod参数.
有没有办法使我的WebMethod参数成为必需,没有手动编辑xsd并将minOccurs设置为1?
我正在给JAX-WS一个高概述,并注意到一些引用sun-jaxws.xml(以及com.sun.xml.ws.transport.http.servlet.WSServletContextListener和com.sun.xml.ws.transport.http.servlet.WSServlet).
在什么情况下需要这个?(我认为JSR 109服务器?!)
jax-ws ×10
java ×9
web-services ×7
jaxb ×2
axis2 ×1
cxf ×1
deployment ×1
ejb-3.0 ×1
glassfish ×1
jax-rpc ×1
maven ×1
soap ×1
tomcat ×1
ws-security ×1
wsimport ×1