gpt4 book ai didi

java - 如何为 Spring Boot Rest 使用自定义异常?

转载 作者:行者123 更新时间:2023-11-29 04:43:49 24 4
gpt4 key购买 nike

我正在使用 Spring Boot 连接到 MySQL 5 数据库(通过 JPA)以及用于服务器端的 Spring Rest。

我的 POJO:

@Entity
public class Employee {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

private String firstName;
private String lastName;

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}
}

员工资源库:

@RepositoryRestResource(collectionResourceRel = "employee", path = "employee")
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long> {

Collection<Employee> findByLastName(@Param("name") String name);

}

员工服务:

@RestController
@RequestMapping("/employee")
public class EmployeeService {

@Autowired
private EmployeeRepository employeeRepository;

@RequestMapping(value = "/findByLastName?{lastName}=", method = RequestMethod.GET)
Object getEmployees(@PathVariable String lastName) {
Collection<Employee> result = this.employeeRepository.findByLastName(lastName);
if (result == null) {
throw new EmployeeNotFoundException(lastName);
}
return result;
}
}

EmployeeNotFoundException:

public class EmployeeNotFoundException extends RuntimeException {

private static final long serialVersionUID = 1L;

public EmployeeNotFoundException(String id) {
super("Could not find Employee " + id);
}
}

现在调用我的 REST API 时,我得到以下结果:

我的数据库中不存在这个,也没有抛出 EmployeeNotFoundException:

curl -X GET -H "Content-Type:application/json" http://localhost:8080/employee/search/findByLastName?name="Smith"

结果:

{
"_embedded" : {
"employee" : [ ]
},
"_links" : {
"self" : {
"href" : "http://localhost:8080/employee/search/findByLastName?name=Smith"
}
}
}

问题:

  1. 为什么抛出我的 EmployeeNotFoundException?有没有更好的方法来实现这一点(以及可能显示的 HTTP 状态代码)?

  2. 关于如何进行单元测试的任何 URL 都很棒(连同最好的单元测试库)...

感谢您花时间阅读本文。

最佳答案

这是因为,下一行返回的不是null,而是一个空列表。

Collection<Employee> result = this.employeeRepository.findByLastName(lastName);

您既可以检查空列表也可以抛出异常,也可以只返回空列表。我不建议为查找/搜索抛出异常。我个人,仅针对 getById 等获取方法抛出任何 NotFoundException。否则我只返回空列表。

if (result == null || result.isEmpty()) {
throw new EmployeeNotFoundException(lastName);
}

此外,修改 Hey-men-wattsup 的代码以发送错误代码,而不是在 Controller 中抛出异常。这将发送 404,NotFound 代码。

@ExceptionHandler(EmployeeNotFoundException.class)
public void handleException(EmployeeNotFoundException e, , HttpServletResponse response) {
response.sendError(HttpStatus.NOT_FOUND.value(), e.getMessage());
}

Spring Boot Test 的 MockMvc 类与 Mockito 相结合,提供了对 Controller 进行单元测试所需的方法。

关于java - 如何为 Spring Boot Rest 使用自定义异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38087620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com