所有的JavaBean和DTO的互相轉換接口,JavaBean轉化成DTO或者DTO轉換JavaBean:
public abstract class Converter<A, B> { protected abstract B doForward(A a); protected abstract A doBackward(B b); }
一個JavaBean:
import lombok.Data; import org.bson.types.ObjectId; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Data @Document(collection = "user") public class User { @Id private ObjectId id; private String username; private String password; }
對應的DTO,無參構造方法,以及全部參數方法of,以及私有靜態內部類繼承抽象類Convert並實現兩個轉換方法:
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.BeanUtils; import study.Converter; import javax.validation.constraints.NotNull; @NoArgsConstructor @AllArgsConstructor(staticName = "of") @Data public class UserDTO { /** * AllArgsConstructor注解和NotNull注解配合使用,參數不為null */ @NotNull(message = "username is null") private String username; @NotNull(message = "password is null") private String password; public User convertToUser(){ UserDTOConvert userDTOConvert = new UserDTOConvert(); User convert = userDTOConvert.doForward(this); return convert; } public UserDTO convertFor(User user){ UserDTOConvert userDTOConvert = new UserDTOConvert(); UserDTO convert = userDTOConvert.doBackward(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) { UserDTO userDTO = new UserDTO(); BeanUtils.copyProperties(user,userDTO); return userDTO; } } }
Controller中一個方法接受DTO參數,使用注解@Valid配合DTO屬性上注解@NotNull使用;
接受參數,持久化,返回對象,如此優雅。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; @RestController @RequestMapping(value = "/api/user") public class UserController { @Autowired private UserService userService; @PostMapping public UserDTO addUser(@Valid UserDTO userDTO){ User user = userDTO.convertToUser(); User addUser = userService.addUser(user); UserDTO result = userDTO.convertFor(addUser); return result; } }
來源:
https://www.itcodemonkey.com/article/6309.html?tdsourcetag=s_pctim_aiomsg