当前位置: 首页 > 知识库问答 >
问题:

JAX-WS WebServiceContext保持为空(注释注入失败)

包子航
2023-03-14

我已经尝试将我的应用程序部署到Tomcat 6与Metro/泽西和Glassfish 3.1.2,但是访问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;
    }
}

下面是相应的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>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/jaxrs/*</url-pattern>
  </servlet-mapping>
</web-app>

最有趣的是,当我通过访问Glassfish生成的URL来测试TestService时:

http://localhost:8080/WebApp/TestService?Tester

我可以通过提交表单来测试/调用“hello”方法,并获得一个有效的WebServiceContext对象,该对象生成适当的文件路径。不幸的是,实际上执行HTTP GET请求

$curl -H "Accept: text/plain" http://localhost:8080/WebApp/jaxrs/test/hello

导致指向Test类中第22行(WebServiceContext)的空指针堆栈跟踪。

为什么Web服务在Glassfish测试工具中工作,而不是从实际的HTTP请求中工作?

更新:

如果您使用GlassFish默认XML SOAP请求到GlassFish默认URL,我能够确认Web服务工作完美(WebServiceContext已正确注入),如下所示:

$curl -X POST -d @req.xml http://localhost:8080/ZlotyGlassfish/TestService --header "Content-Type:text/xml" 

其中文件"req.xml"的内容是匹配WSDL定义的请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:impl="http://impl.rest.webservice.webapp.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <impl:hello/>
   </soapenv:Body>
</soapenv:Envelope>

我的主要问题仍然是,为什么通过默认的GlassFish实现,这一点可以完美地工作,但@GET和@Path符号生成的endpoint无法注入适当的WebServiceContext对象?

共有1个答案

谢烨烨
2023-03-14

不同之处在于默认的GlassFish实现是基于JAX-WS SOAP的Web服务,对于JAX-RS Web服务,您应该使用以下注释来注入上下文。

 @Context 
 private ServletContext sc;

您还可以使用@Context annotation来注入其他类型,例如UriInfoHttpHeaders。有关详细信息,请参阅泽西岛文档WebServiceContextMessageContext是在JAX-RS上下文中没有意义的JAX-WS对象

 类似资料:
  • 问题内容: 我有以下class和web.xml文件。spring框架是否支持jax-rs注释,如和,…等。 换句话说我可以代替 Java: web.xml 问题答案: 不,您不能在春季使用批注。您可以在spring上使用类似的东西。这很容易。如果需要,我可以提供一个示例。(Jersey和CXF也具有良好的JAX- RS实现。) AFAIK Springsource不知道要提供JAX-RS的实现。因

  • 我已经编写了一个EJB3业务逻辑并部署在GlassFish下。现在,我将通过同一个容器中的客户机,用@EJB注入接口来测试它。 数据源bean是一个在构造函数中设置连接并通过get()方法释放的无状态bean

  • JAX-RS 具有 HTTP 谓词的注释()和 (),但没有注释。如何为 HTTP 动词添加注释? 如下所示:

  • 和和注释之间有什么区别? 我们应该在什么时候使用它们每一个?

  • 我正在使用Spring Framework/Data/HATEOAS,并试图添加dozer。 和以下汇编程序: 所以,-我对豆子和注射很陌生-但我想工厂的豆子是?应该?来注入映射器。但是映射器肯定是空的。我知道我做得不对,但我做错了什么?

  • 我对Jackson注释有一个问题,在《大部头1》中似乎被忽略了。我使用Jackson将REST响应序列化为JSON。我打开了设置: openejb。cxf。jax-rs.providers=org。科德豪斯。杰克逊。jaxrs。JacksonJsonProvider在系统中。属性 Jackson序列化工作正常,除了所有似乎被完全忽略的Jackson注释。事件像@JsonIgnore或@JsonPr