我有一个简单的命令行Java JAX-WS应用程序来测试SOAP请求,但是服务器期望密码类型是PasswordText,我对如何设置它感到难过......
代码如下:
@WebServiceRef
private static final HelloService helloService = new HelloService(url, new QName(
URL, "HelloService"));
public static void main(final String... args) {
try {
final HelloPort helloPort = helloService.getHelloPort();
final BindingProvider hB = ((BindingProvider) helloPort);
hB.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
END_POINT_ADDRESS);
hB.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,
USERNAME);
hB.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY,
PASSWORD);
...
Run Code Online (Sandbox Code Playgroud)
我已经使用SOAP-UI测试了请求,所以我知道它正在运行.任何有关设置密码类型的帮助将不胜感激.
谢谢.
在最新版本的JAXB(2.2.1)中有一个修复程序.我正在尝试确定它是否包含在最近的Java 6更新中.有没有办法告诉哪些版本的JVM/JRE/JDK包含哪些版本的JAX-WS/JAXB?
查看Sun/Oracle的站点,我可以查看最新版Java SE 6 的发行说明,但我无法分辨哪些版本的XML库包含在内.我想我可以下载最新的JDK并运行'xjc -version',但应该有一个更好的方法(特别是如果它是在之前的版本中添加的那样 - 我不想继续下载JRE来告诉哪个是第一个与我感兴趣的JAXB版本).
我正在使用JAX-WS,我在检索使用Web服务的客户端信息时遇到问题.我已经找到了如何使用JAX-RPC和Apache Tomcat Axis,但没有使用JAX-WS.有没有人对此有所了解?
我构建了一个最小的Web服务,并使用javax.xml.ws.Endpoint发布它.如果我试图获得WSDL
http://localhost:1234/AddService?wsdl它工作正常.
试图收到它http://192.168.0.133:1234/AddService?wsdl,我没有收到任何东西.该地址与localhost相同.
是否有可能在不提供地址的情况下发布网络服务?
package test;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class AddService {
@WebMethod
public int add(int a, int b){
return a+b;
}
public static void main(String[] args ){
Endpoint.publish("http://localhost:1234/AddService", new AddService());
}
}
Run Code Online (Sandbox Code Playgroud)
将代码更改为
Endpoint.publish("http://192.168.0.133:1234/AddService", new AddService());
Run Code Online (Sandbox Code Playgroud)
获取IP地址上的wsdl但不是localhost.
是不是只有定义端口的可能性?
由于WS客户端端口的初始化成本太高,我们希望重用相同的实例.我们还希望在每次调用之前在BindingProvider/RequestContext中设置不同的值.最初我们想这样做:
MyService service = new MyService(wsdlURL, name);
MyPort myPort = service .getMyServicePort();
Run Code Online (Sandbox Code Playgroud)
然后,在每次调用之前执行此操作:
Map requestContext = ((BindingProvider)myPort ).getRequestContext();
requestContext.put(BindingProvider.USERNAME_PROPERTY, uName);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, pWord);
myPort.someFunctionCall();
Run Code Online (Sandbox Code Playgroud)
我的问题是,这个代码线程安全吗?JAX-WS文档似乎表明它不是线程安全的.但是,如果采取预防措施,CXF似乎也是如此.如果特别是JAX-WS和Metro不是线程安全的,有没有办法确保线程安全而不同步访问端口或ws操作?
我正在尝试为webservices生成我的WSDL,但是我收到此错误:
Note: ap round: 2
Exception in thread "main" javax.xml.ws.WebServiceException: Unable to create JAXBContext
at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:153)
at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:83)
at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:244)
at com.sun.tools.internal.ws.wscompile.WsgenTool.buildModel(WsgenTool.java:229)
at com.sun.tools.internal.ws.wscompile.WsgenTool.run(WsgenTool.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.tools.internal.ws.Invoker.invoke(Invoker.java:105)
at com.sun.tools.internal.ws.WsGen.main(WsGen.java:41)
Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.lang.StackTraceElement does not have a no-arg default constructor.
this problem is related to the following location:
at java.lang.StackTraceElement
at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace()
at java.lang.Throwable
at java.lang.Exception
at java.sql.SQLException
at private java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException
at wsdb.jaxws.SQLExceptionBean
at … 我们在JAX-WS中实现了一组Web服务,并SOAPHandler在SOAP头中添加了控制属性.今天,我们需要@HandlerChain在我们创建的每个新服务中添加注释.
这个想法是新服务实现者不需要知道@HandlerChain存在.
有没有办法配置一个Handler拦截WAR中运行的所有服务的全局?
我有一个JAX-WS驱动的Web服务,其WSDL我们从另一个Maven模块生成一个Web服务客户端(我将调用它ws-consumer).
无论好坏,我们将"已发布的WSDL"(服务在发布时保存/生成的WSDL和XSD的版本)src/wsdl复制到我们的文件夹中ws-consumer,然后使用jaxws-maven-pluginorg.jvnet生成使用jaxws:wsimport以下内容的客户端(截断)配置:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<!--phase>generate-sources</phase -->
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlDirectory>src/main/resources/META-INF/wsdl/</wsdlDirectory>
<wsdlFiles>
<wsdlFile>MyWS/MyWS.wsdl</wsdlFile>
</wsdlFiles>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
现在,生成的客户端代码在类级别应用了以下注释:
@WebServiceClient(name = "MyWS", targetNamespace = "http://myws/blah", wsdlLocation = "**file:/C:/some/absolute/path/src/main/resources/META-INF/wsdl/MyWS/MyWS.wsdl"**)
Run Code Online (Sandbox Code Playgroud)
强调我的
正如您所希望看到的那样,wsdlLocation属性值具有硬编码的绝对路径,在部署服务时该路径将不正确.
有什么方法可以通过将其设置为just META-INF/wsdl/MyWS/MyWS.wsdl或其他值来"控制"它?
我正在尝试使用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请求的标题中:
我有一个非常简单的端点使用泽西岛.我的URL是静态的,它不需要任何请求参数.它看起来像这样:
@GET
@Path("/mydata")
@Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
public String getData() {
return "{'name': 'value'}";
}
Run Code Online (Sandbox Code Playgroud)
但是,每当我请求此URL时,我总是会收到405状态代码 - 方法不允许.
奇怪的是,如果我更改@Path注释并定义路径变量,例如@Path("/chart/{blah}")它可以正常工作.
有没有人知道为什么我必须定义一个路径变量才能使它工作?我不需要路径变量,添加一个只是为了获得200响应似乎很愚蠢.