Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在春季,直接从服务返回ResponseEntity是更好的做法,还是应该在控制器内部创建它?_Java_Spring - Fatal编程技术网

Java 在春季,直接从服务返回ResponseEntity是更好的做法,还是应该在控制器内部创建它?

Java 在春季,直接从服务返回ResponseEntity是更好的做法,还是应该在控制器内部创建它?,java,spring,Java,Spring,两个选项中哪一个是更好的实践: (一) 控制器: @GetMapping("/{id}") @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_BACKOFFICE')") public ResponseEntity<Employee> getEmployee(@PathVariable long id) { return employeeService.getEmployee(id); } @GetMapping("/{

两个选项中哪一个是更好的实践:

(一)

控制器:

@GetMapping("/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_BACKOFFICE')")
public ResponseEntity<Employee> getEmployee(@PathVariable long id) {
  return employeeService.getEmployee(id);
}
@GetMapping("/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_BACKOFFICE')")
public ResponseEntity<Employee> getEmployee(@PathVariable long id) {
  return ResponseEntity.ok(employeeService.getEmployee(id));
}

我个人认为1)是更好的选择,因为一些API请求可以返回不同的响应。例如,如果资源存在且已更新,PUT请求可以返回
ResponseEntity.ok
。如果资源不存在,它可以创建它并返回
ResponseEntity.created
。通过直接在服务中返回,可以避免向控制器添加逻辑。这样我就能保持控制器的清洁。但在其他项目中,我看到有人使用选项2),我想知道,这有什么好处?

选项2更好,因为服务不应该知道与http相关的内容

选项2更好,因为服务不应该知道与http相关的内容

,但在某些情况下,这不会给控制器添加额外的逻辑吗?就像我上面写的一个PUT请求的例子。在PUT请求中,在我从控制器内的服务获得答案后,我必须以某种方式检查资源是否已更新或创建,然后根据结果返回不同的HttpStatus。我认为这样做的目的是避免控制器内部的逻辑。它可以向控制器添加逻辑,但它是与web相关的逻辑,实际上属于控制器!您将如何优雅地设计PUT请求示例?因为无论是替换资源还是创建新资源,服务都会返回相同类型的对象。在两种情况下返回的对象类型相同的情况下,控制器如何知道他是否必须返回状态200以表示ok(如果已替换)或状态201(如果已创建)。或者,在调用服务方法之前,控制器是否必须检查资源是否存在,然后调用替换或创建资源的服务方法?该检查是否算作与web相关的逻辑?您可以从服务返回一个包装器对象,并使用一个附加的boolen属性来告知该对象是否已创建或替换,但在某些情况下,这不会向控制器添加附加逻辑吗?就像我上面写的一个PUT请求的例子。在PUT请求中,在我从控制器内的服务获得答案后,我必须以某种方式检查资源是否已更新或创建,然后根据结果返回不同的HttpStatus。我认为这样做的目的是避免控制器内部的逻辑。它可以向控制器添加逻辑,但它是与web相关的逻辑,实际上属于控制器!您将如何优雅地设计PUT请求示例?因为无论是替换资源还是创建新资源,服务都会返回相同类型的对象。在两种情况下返回的对象类型相同的情况下,控制器如何知道他是否必须返回状态200以表示ok(如果已替换)或状态201(如果已创建)。或者,在调用服务方法之前,控制器是否必须检查资源是否存在,然后调用替换或创建资源的服务方法?该检查是否算作与web相关的逻辑?您可以从服务返回一个包装器对象,并使用一个附加的boolen属性来告知该对象是创建的还是替换的。您的服务不应绑定到web。控制器是一个层,用于将服务的结果调整为web可用的内容。这不是服务的责任。如果您希望对soap web服务或消息传递端点使用相同的服务方法,该怎么办?请参阅第34章的“设计和代码组织的端口和适配器方法”。您的服务不应绑定到web。控制器是一个层,用于将服务的结果调整为web可用的内容。这不是服务的责任。如果您希望对soap Web服务或消息传递端点使用相同的服务方法,该怎么办?请参阅第34章的“设计和代码组织的端口和适配器方法”。
@GetMapping("/{id}")
@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_BACKOFFICE')")
public ResponseEntity<Employee> getEmployee(@PathVariable long id) {
  return ResponseEntity.ok(employeeService.getEmployee(id));
}
Employee getEmployee(long id) {
  return findByEmployeeId(id);
}