实现webservice的类中的变量范围

时间:2015-01-24 13:06:51

标签: web-services jersey

这可能是个愚蠢的问题,但我想知道根本原因。

我正在使用jersey实现一个简单的Web服务。我已经声明了一个全局变量i并初始化为0; 我在sayPlainTextHello()方法中将i设置为10但是当我在sayXMLHello()中显示i时它仍为0;这种行为背后的原因是什么。

服务器端代码

@Path("/hello")
public class Hello 
{
int i = 0;
@GET
@Path("/string")
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello()
{
    i = 10;
    System.out.println("string hello");
    System.out.println("i in string " + i);
    return "Hello";
}

@GET
@Path("/xml")
@Produces(MediaType.TEXT_XML)
public String sayXMLHello()
{
    System.out.println("i in xml"+i);
    System.out.println("xml hello");
    return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "     </hello>";
}

这是我的web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"           xmlns="http://java.sun.com/xml/ns/javaee"     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>com.vogella.jersey.first</display-name>
<welcome-file-list>
  <welcome-file>home.jsp</welcome-file>
  </welcome-file-list>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class> com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>        
    <!-- Register resources and providers under com.vogella.jersey.first package. -->
   <init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>com.spaneos.webservices</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
</web-app> 

1 个答案:

答案 0 :(得分:1)

资源类的默认范围是每请求(或请求范围)。对于每个请求,将创建一个新资源实例来处理该特定请求。

您可以使您的类单例作用域,这意味着将只为整个应用程序创建一个对象,但由于某些原因可能不需要这样做。

如果你想让你的资源类单例作用域,那么你只需用@com.sun.jersey.spi.resource.Singleton

注释你的Hello班级

那就是说,除非你有直接的要求让资源类成为有状态,否则我的目标是让这些类保持无状态。