我是Java Spring的新手,有一个小问题。
我不想将employee_id(来自雇员实体)发送到正文部分(在Postman中)的分配实体。当前它正在运行,因为我正在将employee_id作为PathVariable发送,并且正在使用ResponseBody发送工作分配数据。
@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);
}
它正在使用URL localhost:8080 / add / 35 。 35是employee_id,分配数据可以在(邮递员)的正文中发送。我想做的是,也将主体名发送到员工名中(因此该URL应该仅是/ add),但我无法使其正常工作。
喜欢:
{
"employee_id": 35,
"title": "abc"
}
编辑:
Assignment.java
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;
}
}
AssignmentService.java
public void addAssignment(Assignment e) {
AssignmentRepository.save(e);
}
AssignmentRepository.java
public interface AssignmentRepository extends CrudRepository<Assignment, Integer>{
}
Employee.java
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;
}
}
EmployeeRepository.java
public interface EmployeeRepository extends CrudRepository<Employee, Integer>{
Optional<Employee> findById(Long id);
}
谢谢您的帮助!
答案 0 :(得分:3)
您需要确保您的身体类型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:POST URL/v1/employees/{employee_id}
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:可能没有员工编号创建Assignment
第一种情况:您接受一个工作分配可能没有雇员。
只需将您的关系从“分配”更改为“雇员”:
@OneToOne(optional = true)
@JoinColumn(name = "employee_id", nullable = true)
private Employee 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);
}