【问题标题】:WebServiceContext injecting issue via @Resource annotation通过@Resource 注解的WebServiceContext 注入问题
【发布时间】:2012-09-06 11:38:50
【问题描述】:

我在通过 @Resource 注释注入 WebServiceContext 时遇到问题。 我正在使用 JAXWS + Spring 组合。 这是我使用的一段代码。

@WebService 
public class AdminWSImpl {

  @Resource
  private WebServiceContext context;

...
}

我的 web.xml 的一部分:

...
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


<listener>
    <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>


<servlet>
    <description>JAX-WS endpoint of Admin Service</description>
    <display-name>JAX-WS Admin servlet</display-name>
    <servlet-name>AdminService</servlet-name>
    <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>


<servlet>
    <servlet-name>context</servlet-name>
    <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>     
    <load-on-startup>2</load-on-startup>
</servlet>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

问题是上下文总是空的! 根据How to use @Resource WebServiceContext injection with Spring's @Transactionalsprings-transactional,我已经为上下文定义了setter,并将@Resource注解放在了setter上。

将@Resource 注解放在setter 上的结果是这个堆栈跟踪:

SEVERE: WSSERVLET11: failed to parse runtime descriptor:   javax.xml.ws.WebServiceException: Unable to create JAXBContext
javax.xml.ws.WebServiceException: Unable to create JAXBContext
    at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:171)
    at com.sun.xml.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:99)
    at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:250)
    at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:343)
    at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:205)
    at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:513)
    at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.parseAdapters(DeploymentDescriptorParser.java:257)
    at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.parse(DeploymentDescriptorParser.java:151)
    at com.sun.xml.ws.transport.http.servlet.WSServletContextListener.parseAdaptersAndCreateDelegate(WSServletContextListener.java:131)
    at com.sun.xml.ws.transport.http.servlet.WSServletContextListener.contextInitialized(WSServletContextListener.java:152)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:943)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:563)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1399)
    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 org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)
    at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1500)
    at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:252)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:186)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:563)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at com.googlecode.psiprobe.Tomcat60AgentValve.invoke(Tomcat60AgentValve.java:30)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:662)
   Caused by: java.security.PrivilegedActionException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
    javax.xml.ws.WebServiceContext is an interface, and JAXB can't handle interfaces.
    this problem is related to the following location:

谁能提供帮助?

提前谢谢你!

【问题讨论】:

  • 应该为您的 Web 服务的返回类型和参数创建一个 JAXBContext。由于WebServiceContext 似乎正在AdminWSImpl 上创建JAXBContext

标签: spring jax-ws


【解决方案1】:

我找到了现在可行的解决方案! 我将 WebService 注释与 endpointInterface 属性一起添加,并添加了由 wsimport 生成的类实现 Admin 接口。 我的 web.xml 与问题中描述的保持一致!

  @WebService(endpointInterface = "my.app.admin.Admin")
  public class AdminWSImpl implements Admin{

  @Resource
  private WebServiceContext wsContext;

  public void setWsContext(WebServiceContext wsContext) {
    this.wsContext = wsContext;
}
 }

【讨论】:

  • 你不应该用注释@WebMethod(exclude = true) 标记setWsContext 吗?我也有..
  • 您是否定义了 SEI(服务端点接口)?我相信在我的情况下,Web 服务的合同是 SEI,因此只有在 Admin 接口中定义的方法才会公开为 WS 方法。所以我认为 @WebMethod(exclude = true) 不是必需的。
猜你喜欢
  • 1970-01-01
  • 2011-08-14
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2015-11-15
  • 2018-05-06
  • 1970-01-01
相关资源
最近更新 更多