再以上班的 API 实例进行说明,我们现在对 DTO 数据进行检查:
- public class UserDTO {
- @NotNull
- private String username;
- @NotNull
- private int age;
- //其他代码略
- }
API 验证:
- @PostMapping
- public UserDTO addUser(@Valid UserDTO userDTO){
- User user = userDTO.convertToUser();
- User saveResultUser = userService.addUser(user);
- UserDTO result = userDTO.convertFor(saveResultUser);
- return result;
- }
我们需要将验证结果传给前端,这种异常应该转化为一个 api 异常(带有错误码的异常)。
- @PostMapping
- public UserDTO addUser(@Valid UserDTO userDTO, BindingResult bindingResult){
- checkDTOParams(bindingResult);
- User user = userDTO.convertToUser();
- User saveResultUser = userService.addUser(user);
- UserDTO result = userDTO.convertFor(saveResultUser);
- return result;
- }
- private void checkDTOParams(BindingResult bindingResult){
- if(bindingResult.hasErrors()){
- //throw new 带验证码的验证错误异常
- }
- }
BindingResult 是 Spring MVC 验证 DTO 后的一个结果集,可以参考spring 官方文档(http://spring.io/)。
检查参数后,可以抛出一个“带验证码的验证错误异常”,具体异常设计可以参考如何优雅的设计 Java 异常(http://lrwinx.github.io/2016/04/28/%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E7%9A%84%E8%AE%BE%E8%AE%A1java%E5%BC%82%E5%B8%B8/)。
拥抱 lombok
上边的 DTO 代码,已经让我看的很累了,我相信读者也是一样,看到那么多的 Getter 和 Setter 方法,太烦躁了,那时候有什么方法可以简化这些呢。
请拥抱 lombok,它会帮助我们解决一些让我们很烦躁的问题
去掉 Setter 和 Getter
其实这个标题,我不太想说,因为网上太多,但是因为很多人告诉我,他们根本就不知道 lombok 的存在,所以为了让读者更好的学习,我愿意写这样一个例子:
- @Setter
- @Getter
- public class UserDTO {
- @NotNull
- private String username;
- @NotNull
- private int age;
- public User convertToUser(){
- UserDTOConvert userDTOConvert = new UserDTOConvert();
- User convert = userDTOConvert.convert(this);
- return convert;
- }
- public UserDTO convertFor(User user){
- UserDTOConvert userDTOConvert = new UserDTOConvert();
- UserDTO convert = userDTOConvert.reverse().convert(user);
- return convert;
- }
- private static class UserDTOConvert extends Converter<UserDTO, User> {
- @Override
- protected User doForward(UserDTO userDTO) {
- User user = new User();
- BeanUtils.copyProperties(userDTO,user);
- return user;
- }
- @Override
- protected UserDTO doBackward(User user) {
- throw new AssertionError("不支持逆向转化方法!");
- }
- }
- }
看到了吧,烦人的 Getter 和 Setter 方法已经去掉了。
但是上边的例子根本不足以体现 lombok 的强大。我希望写一些网上很难查到,或者很少人进行说明的 lombok 的使用以及在使用时程序语义上的说明。
比如:@Data,@AllArgsConstructor,@NoArgsConstructor..这些我就不进行一一说明了,请大家自行查询资料。
bean 中的链式风格
什么是链式风格?我来举个例子,看下面这个 Student 的 bean:
- public class Student {
- private String name;
- private int age;
- public String getName() {
- return name;
- }
- public Student setName(String name) {
- this.name = name;
- return this;
- }
- public int getAge() {
- return age;
- }
- public Student setAge(int age) {
- return this;
- }
- }
(编辑:ASP站长网)
|