有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java@PostMapping与多个RequestBody

我对JavaSpring非常陌生,有一个小问题

我不想将员工id(从员工实体)发送到身体部位的分配实体(邮递员)。目前它正在工作,因为我将employee_id作为PathVariable发送,并使用ResponseBy发送分配数据

@PostMapping("/add/{employee_id}")
   public void addEmployee(@PathVariable(value = "employee_id", required = false) Long employee_id, 
             @RequestBody Assignment a) {

       Employee employeeById = employeeRepository.findById(employee_id)
               .orElseThrow(() -> new RuntimeException("Employee not found"));

       a.setEmployee(employeeById);
       assignmentRepository.addAssignment(a);
   }

它正在使用urllocalhost:8080/add/35。35是员工id,分配数据可以在(邮递员)的正文中发送。我想做的是,在正文中也发送员工id(因此url应该是/add),但我无法让它工作

就像这样:

{
  "employee_id": 35,
  "title": "abc"
}

编辑:

任务。爪哇

public class Assignment {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Integer id;

   @OneToOne(optional = false)
   @JoinColumn(name = "employee_id", nullable = false)
   private Employee employee;

   @Size(min = 3, max = 50)
   private String assignment_title;

   public Assignment() {
   }

   public Assignment(String assignment_title) {
       super();
       this.assignment_title = assignment_title;
   }

   public Integer getId() {
       return id;
   }

   public void setId(Integer id) {
       this.id = id;
   }

   public String getAssignment_title() {
       return assignment_title;
   }

   public void setAssignment_title(String assignment_title) {
       this.assignment_title = assignment_title;
   }

   public Employee getEmployee() {
       return employee;
   }

   public void setEmployee(Employee employee) {
       this.employee = employee;
   }
}

分配服务。爪哇

   public void addAssignment(Assignment e) {
       AssignmentRepository.save(e);
   }

AssignmentRepository。爪哇

public interface AssignmentRepository extends CrudRepository<Assignment, Integer>{
   
}

雇员。爪哇

public class Employee{
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Integer id;
   
   @OneToOne(optional = false)
   @JoinColumn(name = "user_id", nullable = false)
   private User user;

   @Size(min=3, max = 100)
   private String title;

   @Size(min=3, max = 50)
   private String staff;

   private Long degree;

   public Employee() {}

   public Employee( String title, String staff, Long degree) {
       super();
       this.title = title;
       this.staff = staff;
       this.degree = degree;
   }
   
   public Integer getId() {
       return id;
   }

   public void setId(Integer id) {
       this.id = id;
   }

   public String getTitle() {
       return title;
   }

   public void setTitle(String title) {
       this.title = title;
   }

   public String getStaff() {
       return staff;
   }

   public void setStaff(String staff) {
       this.staff = staff;
   }

   public Long getDegree() {
       return degree;
   }

   public void setDegree(Long degree) {
       this.degree = degree;
   }

   public User getUser() {
       return user;
   }

   public void setUser(User user) {
       this.user = user;
   }

}

雇员安置处。爪哇

public interface EmployeeRepository extends CrudRepository<Employee, Integer>{
   Optional<Employee> findById(Long id);
}


提前谢谢你的帮助


共 (1) 个答案

  1. # 1 楼答案

    您需要确保您的主体类型Assignment具有如下属性

    public class Assignment {
        public Long employee_id;
        // ommitted
    }
    

    然后用你的方法像

    @PostMapping("/add")
    public void addEmployee(@PathVariable(value = "employee_id", required = false) Long employee_id, @RequestBody Assignment a) {
        Long employee_id = a.employee_id;
        Employee employeeById = employeeRepository.findById(employee_id)
            .orElseThrow(() -> new RuntimeException("Employee not found"));
        a.setEmployee(employeeById);
        assignmentRepository.addAssignment(a);
    }
    

    但这种实现并不尊重HTTP标准。 请考虑您的实际实现几乎尊重这些标准,并且您应该以这种方式重命名API:^ {CD2}} BR/> 本blog解释了这些标准

    使用提供的规范进行编辑:

    @PostMapping(values = {"/v1/employees", "/v1/employees/{employee_id}"})
    public void addEmployee(@PathVariable(value = "employee_id", required = false) Long employee_id, @RequestBody Assignment a) {
        Long yourId = employee_id != null ? employee_id : a.employee_id;
        if (yourId == null) {
            throw new RuntimeException("No id given"); // Not clean either but implemented by OP
        } else {
            Employee employeeById = employeeRepository.findById(yourId)
                .orElseThrow(() -> new RuntimeException("Employee not found"));
            a.setEmployee(employeeById);
            assignmentRepository.addAssignment(a);
        }
    }
    

    由于pathvariable是可选的,所以您尝试首先从url获取它,然后从body对象获取它

    编辑2:可能会创建一个没有员工id的Assignment
    第一种情况:您接受任务可能没有员工
    只需将您的关系从派遣更改为员工:

        @OneToOne(optional = true)
        @JoinColumn(name = "employee_id", nullable = true)
        private Employee employee;
    

    第二种情况:您希望首先创建一名新员工,然后将其绑定到您的分配中,因为Assignment应该始终具有Employee

    @PostMapping(values = {"/v1/employees", "/v1/employees/{employee_id}"})
    public void addEmployee(@PathVariable(value = "employee_id", required = false) Long employee_id, @RequestBody Assignment a) {
        Long yourId = employee_id != null ? employee_id : a.employee_id;
        Employee employeeById = yourId != null ?
            employeeRepository.findById(yourId).orElseThrow(() -> new RuntimeException("Employee not found"))
            : new Employee("title","staff",2L);
        a.setEmployee(employeeById);
        assignmentRepository.addAssignment(a);
    }