我刚刚开始学习Java Web服务(JAX-WS),并且有一个问题。参考文档总是谈论Web服务容器。我的问题是:什么是Web服务容器,为什么我们需要它。我在“ Java Web服务启动并运行”一书中看到了一个JAX-WS的简单示例,其中使用以下内容发布了Web服务:
Endpoint.publish("http://127.0.0.1:9876/ts", new TimeServerImpl());
Run Code Online (Sandbox Code Playgroud)
此示例不需要我在Web Server / App Server或任何容器中托管Web服务。
而且我还能够访问该Web服务。
那么什么是容器,为什么我们需要它用于Web服务?
我试图直接从@Webservice类生成WS客户端jar.
我们来看这个例子:
package com.example.maven.jaxws.helloservice;
import javax.jws.WebService;
@WebService
public class Hello {
public String sayHello(String param) {
; return "Hello " + param;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以生成一个war文件并使用glassfish来提供这个webservice,从那里我可以使用glassfish WSDL URL来生成客户端源.
我想要做的是跳过glassfish部分.从定义webservice的maven项目开始,我想使用jaxws-maven-plugin来创建客户端类,但我找不到任何方法来指定webservice的实际URL.
应该可能吧?
有没有办法引用分布在JAR文件中的处理程序配置文件(例如:handler.xml)?
像这样:@HandlerChain(file="somefile.jar")或者@HandlerChain(file="myhandler.xml"),假设myhandler.xml存储在somefile.jar.
我们正在开发一个具有几十个服务接口的相当大的应用程序.对于每个服务,使用wsgen生成wsdl(使用jaxws-maven-plugin maven插件).对于每个服务,在wsdl中使用不同的命名空间.
服务接口共享一组公共bean(主要是DTO).现在,每个wsdl的XSD中定义了这些公共类的定义,重复了很多信息,这给我们在客户端造成了问题(大量编译时,类不兼容).
首先,我尝试使用schemagen为公共类创建模式,但无法将其传递给wsgen.有没有办法将一个(或多个)常见XSD传递给wsgen并让生成的wsdl(s)引用这些?
我还尝试使用指定自定义命名空间的@XmlRootElement来注释公共类:这次wsgen识别了自定义命名空间,并为每个wsdl生成了一个XSD,但没有在任何地方包含单个(公共)xsd.
有人能指出我这个问题的解决方案吗?
有一个由年轻的杨优秀的文章,介绍了如何使用的wsimport创建具有异步Web服务调用Web服务客户端工件.异步要求WSDL具有标记
<enableAsyncMapping>true</enableAsyncMapping>
在其绑定部分.如果您使用自下而上的方法和JAX-WS带注释的Java类,则无法直接在WSDL中执行此操作,因为WSDL是Web服务器上生成的工件.相反,当在WSDL上执行wsimport时,您使用Ant或Maven等构建工具来包含此绑定.
生成的客户端工件具有返回a的异步方法调用
Future<?>
Run Code Online (Sandbox Code Playgroud)
或者a
Response
Run Code Online (Sandbox Code Playgroud)
这是一个未来.
阅读杨的文章后我的问题是为什么不只是使用Executors和Futures滚动我自己的异步Web服务调用.wsimport创建的工件是否提供了一些我无法通过自己的方法看到的优势?
如果有人对这两种方法都有经验或见解,我将非常感谢您的反馈.
这是代码第一种Jax-WS Web服务方法.
@WebService (serviceName = "MyInstallPhotoService")
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
public class MyInstallPhotoWS {
private MyInstallPhotoManager myInstallPhotoManager;
@Resource
WebServiceContext context;
@WebMethod(operationName = "getMyInstallPhoto")
@WebResult(name = "PhotoRetrievalResponse", partName = "PhotoRetrievalResponse")
public MyInstallPhotoResponse getBadgePhoto(@WebParam(name = "BadgeNumber", partName = "BadgeNumber") String badgeNumber, @WebParam(name = "LastName", partName = "LastName") String lastName) {
MyInstallPhotoResponse myInstallPhotoResponse = new MyInstallPhotoResponse();
try {
// more code here
} catch (Exception e) {
e.printStackTrace();
}
return myInstallPhotoResponse;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,MyInstallPhotoResponse在xml架构中定义.SoapUI请求生成了这样的东西
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<rsw:getBadgePhoto>
<!--Optional:-->
<rsw:BadgeNumber>I180748-003</rsw:BadgeNumber>
<!--Optional:-->
<rsw:LastName>Jones</rsw:LastName>
</rsw:getBadgePhoto> …Run Code Online (Sandbox Code Playgroud) 我正在使用通用的Handler类实现许多JAX-WS Web服务,以验证传入SOAP消息的正确结构.
有没有办法获取指向当前消息的URL,以便我可以自动从此URL获取架构并验证消息?
如果这是一个错误的肥皂请求,我需要获取错误的详细信息.
我正在使用JAX-WS来创建Web服务客户端.我的问题是,在错误的事务中,Web服务客户端能够捕获SOAPFaultException但没有详细信息:
javax.xml.ws.soap.SOAPFaultException: Component Interface API. at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
Run Code Online (Sandbox Code Playgroud)
如果我通过SOAPUI发送请求,我可以获得详细信息的响应:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>Component Interface API.</faultstring>
<detail>
<IBResponse type="Error">
<DefaultTitle>Integration Broker Response</DefaultTitle>
<StatusCode>20</StatusCode>
<MessageSetID>180</MessageSetID>
<MessageID>117</MessageID>
<DefaultMessage>You are allowed to claim one meal per day</DefaultMessage>
<MessageParameters>
<keyinformation>
<EMPLID>112233</EMPLID>
</keyinformation>
</MessageParameters>
</IBResponse>
</detail>
</SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
我是否错过了Web服务客户端中的任何配置?提前谢谢了.
我在CXF中通过JAXRSClientFactoryBean.create创建了一个JAX-RS客户端.如何设置连接/接收超时?
我想我需要掌握管道,但无法弄清楚如何.这个项目没有使用Spring.
我是GlassFish Server和WS的新手.我刚刚部署了一个Web应用程序.使用具有此web.xml的maven生成
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
Run Code Online (Sandbox Code Playgroud)
我单击Web应用程序链接
我在应用程序中有这个类:
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.servlet.http.HttpSession;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
@WebService(serviceName="IberiaWS")
public class IberiaWS {
@Resource
private WebServiceContext wsContext;
public IberiaWS () {
}
private UserVO getSessionUserVO() {
MessageContext mc = wsContext.getMessageContext();
HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
return (UserVO)session.getAttribute("uservo");
}
private void setSessionUserVO(UserVO uservo) {
MessageContext mc = wsContext.getMessageContext();
HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
session.setAttribute("uservo", uservo);
}
@WebMethod
public boolean …Run Code Online (Sandbox Code Playgroud) jax-ws ×10
java ×7
web-services ×5
wsdl ×3
asynchronous ×1
containers ×1
cxf ×1
glassfish ×1
java-ee ×1
maven-2 ×1
soap ×1
wsgen ×1
xsd ×1