我正在尝试绑定到在JBoss服务器上托管的测试环境中运行的现有遗留Web服务,但由于以下异常,Spring无法创建bean:
Caused by: 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.xml.internal.ws.client.WSServiceDelegate.createSEIPortInfo(WSServiceDelegate.java:687)
at com.sun.xml.internal.ws.client.WSServiceDelegate.addSEI(WSServiceDelegate.java:675)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:330)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:313)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:295)
at javax.xml.ws.Service.getPort(Service.java:92)
at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.getPortStub(JaxWsPortClientInterceptor.java:413)
at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.prepare(JaxWsPortClientInterceptor.java:337)
at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.afterPropertiesSet(JaxWsPortClientInterceptor.java:316)
at org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean.afterPropertiesSet(JaxWsPortProxyFactoryBean.java:42)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
... 38 more
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 uk.co.example.UserException
at public javax.xml.bind.JAXBElement uk.co.example.ObjectFactory.createUserException(uk.co.example.UserException)
at uk.co.example.ObjectFactory
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:140)
我通过Spring xml绑定到web服务:
<bean id="auth1" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
<property name="serviceInterface" value="uk.co.example.Authentication" />
<property name="wsdlDocumentUrl" value="http://testdomain.co.uk:30001/services/authentication?wsdl" />
<property name="namespaceUri" value="http://example.co.uk/" />
<property name="serviceName" value="AuthenticationWebServiceService" />
<property name="portName" value="AuthenticationPort" />
<property name="maintainSession" value="true" />
</bean>
我的UserException只是扩展了java.lang.Exception:
public class UserException extends Exception
{
}
所以我的webservice包含一个声明抛出UserException的方法。 UserException扩展了java.lang.Exception,其中包含对StackTraceElement的引用,该引用没有no-arg构造函数。因此JAXB异常。我从这个问题的其他一些帖子中得到了很多。
我不明白的是:为什么这个特定的webservice和这个特殊的异常类?当然,我怎么纠正这个?
我的webservice抛出了许多其他异常(大多数似乎扩展了java.lang.Exception)。在同一个JBoss服务器上运行的另一个webservice(不会抛出UserException,但会抛出其他定制的Exception子类)也能正常工作。两组不同的Web服务具有不同的客户端jar。
我只是简单地创建了一个Eclipse Maven项目,在Spring测试和web jar(v3.1.0),junit和log4j中完成。 2个客户端jar(预先存在作为遗留构建的一部分)也在类路径上。我创建了一个Junit,它将代理bean自动装配为Authentication接口,并在其上调用authenticateUser()方法。
因为它是遗留代码,所以我无法更改正在运行的Web服务或生成的客户端jar中的任何内容。
有什么建议吗?
对于webservices以及我们的遗留代码是如何构建和部署的,我承认自己有点新手,所以不要害怕问任何你认为可能太明显的东西!