尝试部署我的应用程序时,我似乎遇到以下异常:
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
java.util.List is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
at java.util.List
at private java.util.List foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return
at foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse
java.util.List does not have a no-arg default constructor.
this problem is related to the following location:
at java.util.List
at private java.util.List foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return
at foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse
Run Code Online (Sandbox Code Playgroud)
我的代码工作得很好,直到我将返回类型从List更改为List <List <RelationCanonical >>
这是部分Web服务:
@Name("relationService")
@Stateless
@WebService(name = "RelationService", serviceName = "RelationService")
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public …Run Code Online (Sandbox Code Playgroud) 我正在JBoss 5和Java 1.6下开发Web服务.什么可能导致这个例外?下面是我简化的Web服务代码.
@Stateless
@WebService()
public class AccountWS {
@WebMethod()
public CreateAccountResponse createAccount(@WebParam(name = "request") CreateAccountRequest request) {
return null;
}
Run Code Online (Sandbox Code Playgroud)
以下是完整的堆栈跟踪.
16:19:03,421 ERROR [AbstractKernelController] Error installing to Real: name=vfsfile:/C:/Apps/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/sif_esb.esb/ state=PreReal mode=Manual requiredState=Real
org.jboss.deployers.spi.DeploymentException: Error during deploy: vfsfile:/C:/Apps/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/sif_esb.esb/
at org.jboss.deployers.spi.DeploymentException.rethrowAsDeploymentException(DeploymentException.java:49)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:177)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1440)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1158)
at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1099)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1633)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:935)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1083)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:985)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:823)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:782)
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702)
at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70)
at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53)
at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:403)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1633)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:935) …Run Code Online (Sandbox Code Playgroud) 我们的系统使用基于服务的WSDL生成的JAX-WS客户端存根来使用SOAP Web服务.如果出现错误,服务器返回SOAP错误,如下所示:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header />
<s:Body>
<s:Fault>
<faultcode>SomeErrorCode</faultcode>
<faultstring xml:lang="en-US">Some error message</faultstring>
<detail>
<ApiFault xmlns="http://somenamespace.com/v1.0" xmlns:a="http://somenamespace.com/v1.0" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:RequestId>123456789</a:RequestId>
<a:CanRetry>true</a:CanRetry>
</ApiFault>
</detail>
</s:Fault>
</s:Body>
Run Code Online (Sandbox Code Playgroud)
基于WSDL SomeCustomFault生成异常类,并声明所有服务方法抛出此异常(见下文)异常.
@WebFault(name = "ApiFault", targetNamespace = "http://services.altasoft.ge/orders/v1.0")
public class SomeCustomFault
extends Exception
{
private ApiFault faultInfo;
public SomeCustomFault(String message, ApiFault faultInfo) {
super(message);
this.faultInfo = faultInfo;
}
public SomeCustomFault(String message, ApiFault faultInfo, Throwable cause) {
super(message, cause);
this.faultInfo = faultInfo;
}
public ApiFault getFaultInfo() {
return faultInfo;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,此自定义错误异常扩展Exception而非SOAPFaultException.Hovewer我需要获取SOAP …
JBoss 6.0 Final附带了JBoss WS(默认情况下为Apache CXF堆栈),我知道我可以用JBossWS下载站点中相应的JBoss WS Native或Metro版本替换默认实现.
问题是,我有一个客户端jar库(不幸的是二进制文件),它使用了一些专有的SOAP Web服务.当我使用部署到JBoss的Web应用程序中的客户端API时,我遇到了大量间歇性SOAP故障(使用Apache CXF和JBoss Native堆栈进行测试).
由于从独立的jar文件(没有第三方JAX-WS实现)运行时,相同的Web服务似乎工作正常,所以我考虑禁用JBoss WS堆栈,转而使用Java SE提供的本机JAX-WS RI堆栈6.
我知道JBoss Metro WS堆栈应该与Java SE 6附带的内容足够接近,但如果我能使用本机Java SE版本,我将非常感激.
那么,这可行吗?有人指出了方向吗?
在wsdl文件中,我有以下行:
当我部署webapplication(在JBOSS 5.1.0上)并尝试访问wsdl时,我得到以下异常:
org.apache.cxf.BusException: No DestinationFactory was found for the namespace http://schemas.xmlsoap.org/soap/http/.
org.apache.cxf.transport.DestinationFactoryManagerImpl.getDestinationFactory(DestinationFactoryManagerImpl.java:115)
org.apache.cxf.endpoint.ServerImpl.initDestination(ServerImpl.java:85)
org.apache.cxf.endpoint.ServerImpl.<init>(ServerImpl.java:69)
org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:118)
org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:167)
org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:346)
org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:259)
org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:209)
org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:404)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1413)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1374)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
java.security.AccessController.doPrivileged(Native Method)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
org.jboss.wsf.stack.cxf.CXFServletExt.loadAdditionalConfigExt(CXFServletExt.java:124)
org.jboss.wsf.stack.cxf.CXFServletExt.loadBus(CXFServletExt.java:101)
org.apache.cxf.transport.servlet.AbstractCXFServlet.init(AbstractCXFServlet.java:78)
org.jboss.wsf.stack.cxf.CXFServletExt.init(CXFServletExt.java:73)
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
se.marakanda.jboss.LoginContextValve.invoke(LoginContextValve.java:44)
org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
java.lang.Thread.run(Thread.java:619)
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.
我正在尝试使用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服务的自下而上方法的限制?