我正在尝试使用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() {
}
}
答案 0 :(得分:0)
最好的方法是注入一些单例服务类,例如EmploeeManager
,其中包含员工地图。 (我不知道你使用spring / cdi的技术)
另一方面,您可以使用
private static Map<Integer, String> employeeMap = new HashMap<>();
并考虑同步,因为它可以同时由多个线程访问。
答案 1 :(得分:0)
查看JAX-RS 2.0 specification关于资源类生命周期的定义:
3.1.1生命周期与环境
默认情况下,会为每个请求创建一个新的资源类实例 到那个资源。首先调用构造函数,然后调用任何请求 注入依赖项,然后调用适当的方法 最后,该对象可用于垃圾收集。 [...]
您需要在问题中描述的行为:为每个请求创建一个新的资源类实例。
要存储数据,您可以使用以下方法:
static
字段,即所有类实例共享的字段;