我正在尝试使用JBossWS 3.1.2开发一个Web服务,它将HashMap作为其参数之一.我正在使用这个版本的JBossWS,因为这是与我正在使用的JBoss版本一起分发的.我正在使用wsprovide生成WSDL并使用wsconsume来创建WS客户端存根.
我的WebService的简化版本是:
@WebService(targetNamespace = "http://localhost/ping", serviceName = "Ping")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class Ping {
@WebMethod
@WebResult(name="result")
public String ping(@WebParam(name="arguments") HashMap arguments) {
return "pong";
}
}
Run Code Online (Sandbox Code Playgroud)
wsprovide创建的WSDL包含:
<types>
<xs:schema targetNamespace='http://localhost/ping' version='1.0' xmlns:tns='http://localhost/ping' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
<xs:complexType name='hashMap'>
<xs:complexContent>
<xs:extension base='tns:abstractMap'>
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType abstract='true' name='abstractMap'>
<xs:sequence/>
</xs:complexType>
</xs:schema>
</types>
Run Code Online (Sandbox Code Playgroud)
生成的客户端代码包含一个空的抽象类AbstractMap.java和一个空类HashMap.
我希望生成类似于以下的WSDL:
<complexType>
<sequence>
<element name="key" type="anyType" />
<element name="value" type="anyType" />
</sequence>
</complexType>
Run Code Online (Sandbox Code Playgroud)
我也尝试用自定义类(ParameterMap)包装HashMap,但只是有更多相同的东西.
我还没有看到下一步吗?我是否遗漏了某些东西,或者这是对使用JBossWS开发Web服务的自下而上方法的限制?
我有一个简单的Web服务使用@PostConstruct和@PreDestory注释.
@PostConstruct
private void init() {...} //initialize some database connection
@PreDestroy
private void release() {...} //release data base resources
Run Code Online (Sandbox Code Playgroud)
然后客户端将调用一些Web方法来执行一些数据库操作.我通过在代码中设置断点进行了简单的测试.该@PostConstruct工程的罚款.但@PreDestroy方法永远不会被调用.
我认为@PreDestroy当客户端完成调用Web方法时总会被调用,因为Web服务本质上是无状态的.所以最后,实例总是被销毁,在此之前,应该调用我的发布方法?这是正确的理解吗?
但在阅读了一些在线资源后,我感到困惑.有人说@PreDestroy当它未部署时会被调用吗?
我有一些EJB作为JAX-WS Web服务:
@WebService
@Stateless
@Remote(MobileFacade.class)
public class MobileFacadeBean implements MobileFacade {
...
@Resource
WebServiceContext wsc;
...
}
Run Code Online (Sandbox Code Playgroud)
在此Web Service类中,通过@Resource注入WebServiceContext.我使用此WebServiceContext来获取实现中的主体.这很有效,但现在我想知道如何(单元)测试这个课程!
到目前为止,我正在使用OpenEJB来测试我的EJB.由于Web Service类也是无状态会话Bean,我真的想在这里使用相同的方法.但是,它并不那么容易 - 当然,它抱怨在没有被称为Web服务时没有WebServiceContext.
所以第一个问题是:有没有办法在OpenEJB中模拟WebServiceContext?
如果不是,您会采用什么方法来测试这种Web服务类?
干杯,弗兰克
我找不到任何如何使用JAXWS从wsdl从服务器骨架(java pojo)创建Web服务的地方.我看到的唯一教程是在NetBeans中使用自动向导,在eclipse中使用axis2.有人可以给我一些关于如何从给定的wsdl生成服务器端类的提示吗?
谢谢
UPADATE:
我只需要:
wsimport.bat -Xendorsed SOAP.WSDL
,它会创建工件.但是现在如何在服务器中实现它?
我正在编写一个Java SOAP客户端,其中多个响应以异步方式返回到Client WebService.由于响应是异步的,因此客户端必须将MessageId传递给SOAPHeader.然后,多个响应将传回相同的MessageId,使客户端能够使用许多响应映射其请求.
我有两个Handler(Protocal和Logical).我的SOAPHandler正在接收MessageId,而LogicalHander正在接收Payload或真实响应.我想以某种方式将这两条信息挂钩在一起.
我的问题是我有两个不同的代码,一个拉MessageId,另一个是Payload,但我没有办法可靠地连接两个.
我不确定我是不是在寻找一些东西.我可以从Protocal或Logical处理程序中提取Header和Payload吗?
我有一个调用web服务的客户端.部分被调用的方法可能需要很长时间才能在服务器上完成(甚至长达1小时).我希望客户端等待那段时间的响应,从而保持连接的活跃!
我试图在客户端中设置以下属性,但没有成功:
((BindingProvider)port).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 0); //0 for disabling any timeouts
Run Code Online (Sandbox Code Playgroud)
一段时间后我仍然会收到Timeout Exception.必须设置哪个属性以防止出现以下错误?
org.apache.cxf.interceptor.Fault: Transaction was rolled back, presumably because setRollbackOnly was called during a synchronization while invoking public abstract boolean my.method
at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:166)
at org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker.createFault(AbstractJAXWSMethodInvoker.java:213)
at org.apache.openejb.server.cxf.ejb.EjbMethodInvoker.preEjbInvoke(EjbMethodInvoker.java:146)
at org.apache.openejb.server.cxf.ejb.EjbMethodInvoker.invoke(EjbMethodInvoker.java:72)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:75)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:107)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:211)
at org.apache.openejb.server.cxf.CxfWsContainer.onMessage(CxfWsContainer.java:73)
at org.apache.openejb.server.webservices.WsServlet.service(WsServlet.java:98)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at …Run Code Online (Sandbox Code Playgroud) 我现在有一个 wsdl 文件。使用 cxf 的 'wsdl2java' 命令,我将 wsdl 转换为 java 类。
我如何为 wsdl 到 java 转换后生成的接口拥有自己的实现类。?基本上我需要执行以下操作: 1.convert wsdl 到 java 类。2.为生成的类编写实现类。3.Inject cxf in this.(cxf.xml and web.xml for apache CXF) 4.Package it to a war。
我几乎看不到这种自下而上方法的教程/帮助(ir,wsdl 到 java 转换机制)
有人可以为此提供一些指示吗?
我有一个调用java Web服务的dot net应用程序.我试图通过将凭据传递给Java服务来实现身份验证.以下是设置凭据的点网代码.如何在我的Java应用程序中获取这些凭据?它们没有设置在标题中......
System.Net.NetworkCredential serviceCredentials = new NetworkCredential("user", "pass");
serviceInstance.Credentials = serviceCredentials;
Run Code Online (Sandbox Code Playgroud)
serviceInstance是SoapHttpClientProtocol的一个实例.
我试过像这样注入WebServiceContext
@Resource
WebServiceContext wsctx;
Run Code Online (Sandbox Code Playgroud)
并从标题中拉出创意,但他们不在那里.
我正在尝试使用node-soap来使用SOAP api.我刚刚运行了一些localhost测试.
这是我的wsdl:http://hastebin.com/orenizosay.xml
这是我的XSD(来自WSDL):http://hastebin.com/zaqogicabo.xml
public class InsulinEndpoint {
public static void main(String[] argv) {
Insulin insulin = new Insulin ();
String address = "http://localhost:8081/insulin/";
Endpoint.publish(address, insulin);
System.out.println("Webservices online at: " + address);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的节点测试应用程序.客户端已成功创建,client.describe()正确显示方法.
soap.createClient(url, function(err, client) {
if (err) throw err;
client.backgroundInsulinDose({arg0: 10}, function(err, result) {
if(err)
console.error(err);
else
console.log(result);
});
});
Run Code Online (Sandbox Code Playgroud)
但是当我尝试调用backgroundInsulinDose时,我的回答是
<faultstring>Cannot find dispatch method for {}backgroundInsulinDose</faultstring>
Run Code Online (Sandbox Code Playgroud)
而且我的node-soap发送的XML消息是
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:tns="http://server/"><soap:Body><backgroundInsulinDose><arg0>10</arg0></backgroundInsulinDose></soap:Body></soap:Envelope>--------------------
Run Code Online (Sandbox Code Playgroud) 我正在用apache cxf创建一个jax-ws客户端。我正在为spring cotext配置苦苦挣扎。我需要的只是将此标头添加到我的soap请求中:
<soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken wsu:Id="usernametoken">
<wsse:Username>login</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
Run Code Online (Sandbox Code Playgroud)
我有三个参数:usernametoken,密码,登录名。
<jaxws:client id="***" name="***"
endpointName="***"
serviceName="***"
address="***"
serviceClass="***"
username="***"
password="***"
xmlns:tns="***">
</jaxws:client>
Run Code Online (Sandbox Code Playgroud)
上面的代码可以正常工作并发送肥皂消息,但是没有安全标头!您能给我一些如何添加标题的想法吗?
jax-ws ×10
java ×5
cxf ×4
web-services ×3
soap ×2
wsdl ×2
annotations ×1
asynchronous ×1
c# ×1
cxf-client ×1
jboss ×1
jbossws ×1
node.js ×1
openejb ×1
pojo ×1
spring ×1
stubs ×1
testing ×1
wsdl2java ×1