2016-04-10 26 views
0

我想用RestEasy学习Restful Web服务。我创建了一个Java类并尝试使用实例变量,但默认范围是请求范围,在事件发生后,变量的值将被清除。我们如何在RestEasy类的不同方法中使用实例变量。 我的代码如下:我们如何在RestEasy中使用实例变量?

 /* 
    * To change this license header, choose License Headers in Project Properties. 
    * To change this template file, choose Tools | Templates 
    * and open the template in the editor. 
    */ 
    package restService; 

    import java.util.HashMap; 
    import java.util.Map; 
    import javax.ws.rs.Consumes; 
    import javax.ws.rs.DELETE; 
    import javax.ws.rs.GET; 
    import javax.ws.rs.POST; 
    import javax.ws.rs.PUT; 
    import javax.ws.rs.Path; 
    import javax.ws.rs.Produces; 

    /** 
    * 
    * @author ilkaygunel 
    */ 
    @Path("/service") 
    public class Service { 
     Map<Integer, String> employeeMap = new HashMap<>(); 



    @GET 
    @Path("/show") 
    @Produces("application/json") 
    public Map show() 
    { 
     return employeeMap; 
    } 

    @POST 
    @Path("/addRecord") 
    @Consumes("application/json") 
    @Produces("application/json") 
    public Map addRecord(Employee employee) { 
     employeeMap.put(employee.getEmployeeId(), employee.getEmployeeName()+" "+employee.getEmployeeSurname()); 
     System.out.println("@POST ile işaretlenmiş metoda gelen veri:"); 
     System.out.println(employee.getEmployeeId()); 
     System.out.println(employee.getEmployeeName()); 
     System.out.println(employee.getEmployeeSurname()); 

     System.out.println("---HashMap İçindeki Veri (POST Metodundan)---"); 
     for (Map.Entry<Integer, String> entry : employeeMap.entrySet()) { 
      System.out.println(entry.getKey() +" " +entry.getValue()); 
     } 
     return employeeMap; 
    } 

    @PUT 
    @Path("/updateRecord") 
    @Consumes("application/json") 
    public void updateRecord(Employee employee) { 
     System.out.println("@PUT ile işaretlenmiş metoda gelen veri:"); 
     System.out.println(employee.getEmployeeId()); 
     System.out.println(employee.getEmployeeName()); 
     System.out.println(employee.getEmployeeSurname()); 

     System.out.println("HashMap'in Boyutu:"+employeeMap.size()); 

     for(Integer key : employeeMap.keySet()) { 
      if(key ==employee.getEmployeeId()) 
      { 
       System.out.println("Buraya Bak:"+employeeMap.get(key)); 
       employeeMap.put(key, employee.getEmployeeName()+" "+employee.getEmployeeSurname()); 
      } 
      break; 
     } 

     System.out.println("---HashMap İçindeki Veri (PUT Metodundan)---"); 
     for (Map.Entry<Integer, String> entry : employeeMap.entrySet()) { 
      System.out.println(entry.getKey() +" " +entry.getValue()); 
     } 
    } 

    @DELETE 
    public void deleteRecord() { 

    } 
} 

回答

0

最好的办法是注入一些单身人士服务类如EmploeeManager其中包含雇员的地图。 (我不知道你用什么样的技术弹簧/ CDI)

在另一方面,你可以使用

private static Map<Integer, String> employeeMap = new HashMap<>(); 

,也想同步的,因为它可以被多个线程同时访问。

0

看一看在JAX-RS 2.0 specification定义了有关资源类的生命周期:

3.1.1生命周期与环境

默认情况下,新的资源类实例为每个请求创建 到那个资源。首先调用构造函数,然后注入任何请求的 依赖关系,然后调用适当的方法并最终使该对象可用于垃圾回收。 [...]

您在问题中描述的行为是预期的:为每个请求创建资源类的新实例。

存储数据,可以使用以下方法:

  • 使用static场,也就是说,是由类的所有实例共享的领域;
  • 使用CDI或Spring等依赖注入框架,并将数据存储到应用程序范围的bean或单例中。这个bean可以注入你的资源类。
  • 使用数据库。
相关问题