我正在尝试编组一个DataHandler具有JAXB(2.1.12)字段的对象.对于流媒体支持,DataHandler使用@进行注释XmlAttachmentRef.通过Web服务进行序列化和流式处理(JBoss上的Metro)运行良好,但是使用JAXB进行简单的编组却没有.
这是一个精简的例子:
public class DataHandlerAttachmentSerialization {
@XmlRootElement
static class RootObject {
@XmlElement
@XmlAttachmentRef // Works without this, but required for streaming
DataHandler dataHandler = new DataHandler(
new com.sun.xml.ws.util.ByteArrayDataSource(
" ".getBytes(), "application/octet-stream"));
}
@Test
public void test() throws JAXBException {
JAXBContext context = JAXBContext.newInstance(RootObject.class);
Marshaller marshaller = context.createMarshaller();
StringWriter writer = new StringWriter();
marshaller.marshal(new RootObject(), writer);
Assert.assertNotNull(writer.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
运行此测试会产生以下堆栈跟踪:
javax.xml.bind.MarshalException
- with linked exception:
[com.sun.xml.bind.api.AccessorException: java.lang.NullPointerException]
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:318)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244)
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:96)
...
Caused …Run Code Online (Sandbox Code Playgroud) 我在Sun轻量级http服务器上发布了Web服务端点.服务器正在运行ThreadPool执行程序以进行连接(Executors.newCachedThreadPool()).我也使用常规的Web服务客户端(也是JAX-WS).
似乎每超过5分钟的呼叫,服务器(或客户端)结束当前的调用线程并打开一个新的调用线程.在服务器中,它看起来像是建立了新连接并尝试运行相同的操作.
这只发生一次,意味着"第二次通话"可能超过5分钟.
连接是否有默认超时?有没有办法配置它?
我使用JAXWS 2.1.7,使用一些类来运行JAXWS的'apt'来生成WSDL.对于日期,我使用
@XmlSchemaType(name="time")
private Date wakeupTime;
Run Code Online (Sandbox Code Playgroud)
并且这会生成一个带有xs:time的模式,但是当这一切都以XML形式出现时,值就像
<wakeupTime>1901-01-01T01:00:00 +10</wakeupTime>
Run Code Online (Sandbox Code Playgroud)
我只想要时间部分!我想我想使用自定义转换器来说xs:time + java.util.Date应该以这样的方式打印和解析,但我看不出我可以将绑定文件传递给apt例程.我不能(出于历史和其他原因)使用XMLGregorianCalendar- 它必须是一个java.util.Date.如何在jaxb中为apt工具指定自定义绑定
我有一个独立的Web服务客户端.在调用任何Web方法时,必须将附加的"cookie"字符串隐式(不是作为Web方法参数)传递给WS.另一端的WS必须能够获取字符串并使用它.怎么能实现这一目标?
我以下列方式调用服务:
Service srv = Service.create(new URL(WSDL), QNAME);
myClassPort = srv.getPort(MyClass.class);
Run Code Online (Sandbox Code Playgroud)
我需要的是在第一行之前放置一些代码,这会使客户端每次通过myClassPort调用一些远程方法时都会发送这个"cookie"字符串.谢谢.
我在JBoss AS Final 7.1.1上使用Spring 3.0.6部署JAX-WS Web服务时遇到了一些问题.
我在本教程中尝试了两种第一种方法:http://www.javacodegeeks.com/2010/11/jaxws-with-spring-and-maven-tutorial.html
当我使用第一种方法(扩展SpringBeanAutowiringSupport并在web.xml中声明servlet)时,应用程序正确部署,但我在Web服务中注入的bean是Null.
使用SimpleJaxWsServiceExporter的第二个方法我在部署时遇到错误:
10:09:33,012 ERROR [org.springframework.web.context.ContextLoader] (MSC service thread 1-2) Context initialization failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter#0' defined in ServletContext resource [/WEB-INF/generic-applicationContext.xml]: Invocation of init method failed; nested exception is javax.xml.ws.WebServiceException: java.lang.RuntimeException: java.net.BindException: Address already in use: bind
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420) [spring-beans-3.0.6.RELEASE.jar:3.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) [spring-beans-3.0.6.RELEASE.jar:3.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) [spring-beans-3.0.6.RELEASE.jar:3.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) [spring-beans-3.0.6.RELEASE.jar:3.0.6.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) [spring-beans-3.0.6.RELEASE.jar:3.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290) [spring-beans-3.0.6.RELEASE.jar:3.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) [spring-beans-3.0.6.RELEASE.jar:3.0.6.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) [spring-beans-3.0.6.RELEASE.jar:3.0.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) [spring-context-3.0.6.RELEASE.jar:3.0.6.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) [spring-context-3.0.6.RELEASE.jar:3.0.6.RELEASE] …Run Code Online (Sandbox Code Playgroud) 我喜欢Enum类型安全,它也使代码更具可读性.Enum每当有机会我总是会利用.
当我需要将这些代码公开为Web服务时,问题就开始了.例如,如果我有这样的枚举:
public enum Language {
ENGLISH(1),
BAHASA_MALAYSIA(2);
}
Run Code Online (Sandbox Code Playgroud)
它将在wsdl中公开,如下所示:
<xs:simpleType name="language">
<xs:restriction base="xs:string">
<xs:enumeration value="ENGLISH"/>
<xs:enumeration value="BAHASA_MALAYSIA"/>
</xs:restriction>
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)
如果将来如果我决定添加一种新语言我将遇到麻烦,wsdl文件会有所不同,它会破坏旧客户端.
我的问题,如何防止枚举在wsdl中作为枚举公开?我想将它暴露为简单的数据类型String或int.
如果重要的话,我正在使用JBoss WS.
将Web服务公开为无状态会话bean是否存在与线程安全相关的好处?
(如果我错了,请纠正我)但我认为Web服务不是线程安全的,并且像Servlet一样,服务器只创建一个Web服务类实例(每个请求不是一个实例).
我不知道它们是否是从像无状态bean这样的bean池中分配的 - 是由app服务器提供的.我试图找到是否将@Stateless annoation与已经使用@WebService注释注释的Web服务一起使用 - 这将迫使应用服务器开始为每个传入请求从池中分配它们.这样我就知道我会为每个传入的请求创建一个单独的实例吗?
annotations web-services jax-ws stateless-session-bean java-ee
我尝试将我的应用程序部署到带有Metro/Jersey和Glassfish 3.1.2的Tomcat 6,但访问WebServiceContext资源总是会导致空指针异常,除非我使用自动生成的Glassfish测试门户测试应用程序.
这是我写的一个简单的测试方法,用于验证:
import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import javax.servlet.ServletContext;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@WebService
@Path("/test")
public class Test {
@Resource
WebServiceContext wsContext;
@GET
@Produces("text/plain")
@Path("/hello")
public String hello() {
MessageContext mc = wsContext.getMessageContext(); // NULL POINT HAPPENS HERE!
ServletContext servletContext = (ServletContext)
mc.get(
MessageContext.SERVLET_CONTEXT);
String s = servletContext.getRealPath("/WEB-INF");
return "Real Path: " + s;
}
}
Run Code Online (Sandbox Code Playgroud)
这里是相应的web-xml(主要由Eclipse自动生成):
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>WebApp</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file> …Run Code Online (Sandbox Code Playgroud) 我正在尝试为Exchange Web服务编写自定义Java客户端.我已经使用生成的客户端存根wsimport工具,说明在这里从EWS的Services.wsdl文件.现在我编写了使用这些存根的代码.我得到以下异常:
Exception in thread "main" com.sun.xml.internal.ws.wsdl.parser.InaccessibleWSDLException: 2 counts of InaccessibleWSDLException.
java.io.IOException: Got Server returned HTTP response code: 401 for URL: https://host.domain.com/ews/Services.wsdl while opening stream from https://host.domain.com/ews/Services.wsdl
java.io.IOException: Got Server returned HTTP response code: 401 for URL: https://host.domain.com/ews/Services.wsdl?wsdl while opening stream from https://host.domain.com/ews/Services.wsdl?wsdl
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(Unknown Source)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source)
at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(Unknown Source)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(Unknown Source)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(Unknown Source)
at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(Unknown Source)
at javax.xml.ws.Service.<init>(Unknown Source)
at com.microsoft.schemas.exchange.services._2006.messages.ExchangeWebService.<init>(ExchangeWebService.java:58)
at com.xyz.abc.EWSJavaAPI.ExchangeAuthenticator.getExchangeServicePort(ExchangeAuthenticator.java:33)
at com.xyz.abc.test.ExchangeDevelopmentTest.main(ExchangeDevelopmentTest.java:35)
Run Code Online (Sandbox Code Playgroud)
我们在上面看到的ExchangeDevelopmentTest是一个使用另一个类的客户端,而另一个类 …
这是我的java项目的设置

我正在尝试通过cmd运行wsgen:
wsgen -keep -cp . com.library.webservice.HelloWorldImplementation
但是我收到了错误
Class not found: "com.library.webservice.HelloWorldImplementation"
此外,该命令正在运行 C:\ ... \WebServices Test\src
知道我做错了什么吗?