我们如何在RestEasy中使用实例变量?

时间:2016-04-10 13:24:09

标签: java resteasy instance-variables

我正在尝试使用RestEasy学习Restful Web Service。我创建了一个Java类并尝试使用实例变量,但默认范围是Request Scope,在事件之后,清除变量的值。我们如何在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() {

    }
}

2 个答案:

答案 0 :(得分:0)

最好的方法是注入一些单例服务类,例如EmploeeManager,其中包含员工地图。 (我不知道你使用spring / cdi的技术)

另一方面,您可以使用

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

并考虑同步,因为它可以同时由多个线程访问。

答案 1 :(得分:0)

查看JAX-RS 2.0 specification关于资源类生命周期的定义:

  

3.1.1生命周期与环境

     

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

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

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

  • 使用static字段,即所有类实例共享的字段;
  • 使用依赖注入框架(如CDI或Spring)并将数据存储到应用程序范围的bean或singleton中。这个bean可以注入你的资源类。
  • 使用数据库。