2012-09-13 15 views
5

Mam problemy z wstrzykiwaniem WebServiceContext za pomocą adnotacji @Resource. Używam kombinacji JAXWS + Spring. Jest to fragment kodu, którego używam.Problem z wtryskiem WebServiceContext za pomocą adnotacji @Resource

@WebService 
public class AdminWSImpl { 

    @Resource 
    private WebServiceContext context; 

... 
} 

Część mojego 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> 

Problemem jest to, że kontekst jest zawsze zerowa! Zgodnie z How to use @Resource WebServiceContext injection with Spring's @Transactional sprężyny transakcyjne zdefiniowałem ustawiacza dla kontekstu i umieścić adnotację @Resource na setera.

Efektem wprowadzenia @Resource adnotacji na seter jest to ślad stosu:

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: 

Czy ktoś może dostarczyć pomocy?

Z góry dziękuję!

+0

Należy utworzyć 'JAXBContext' dla typów zwracanych zi parametrów do usługi WWW. Ponieważ 'WebServiceContext' pojawia się zamiast' 'JAXBContext' jest tworzony na' AdminWSImpl'. –

Odpowiedz

4

Znalazłem rozwiązanie, które teraz działa! Umieściłem adnotację WebService z atrybutem endpointInterface i dodano klasę implementującą interfejs administracyjny generowany przez wsimport. Mój web.xml pozostaje taki sam, jak opisano w pytaniu!

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

    @Resource 
    private WebServiceContext wsContext; 

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

Nie należy oznaczać 'setWsContext' za pomocą adnotacji' @WebMethod (exclude = true) '? Miałem też ... –

+0

Czy zdefiniowałeś SEI (Service Endpoint Interfae)? Wierzę, że w moim przypadku kontrakt na usługi sieciowe to SEI, więc tylko metody zdefiniowane w interfejsie administratora są wyeksponowane jako metody WS. Więc myślę, że @WebMethod (exclude = true) nie jest wymagane. –

Powiązane problemy