変換[Java]dtoとentity-2

21137 ワード

続けて上記に書きます.builder方式でコードを書く量が多く、不便です.問題を解決するために見つけた方法はObjectMapperです.
フロントエンドからバックエンドへのデータはSpringから受信したときもObjectMapperで変換されます.△私はよくエラーメッセージから思い出します.
  • usersDto
  • @Data
    @NoArgsConstructor
    public class UsersDto {
    
        private int id;
        private String token;
        private String password;
        private Date regDate;
        private String email;
    
        @Builder
        public UsersDto(int id, String token, String password, Date regDate, String email) {
            this.id = id;
            this.token = token;
            this.password = password;
            this.regDate = regDate;
            this.email = email;
        }
    // 1편에서 사용한 방식
    public static UsersEntity converter(UsersDto usersDto){
        	if(usersDto == null) return null;
            return UsersEntity.builder()
                    .token(usersDto.getToken())
                    .password(usersDto.getPassword())
                    .regDate(usersDto.getRegDate())
                    .email(usersDto.getEmail())
                    .build();
        }
        
       public static UsersEntity mapper(UsersDto usersDto){
            if(usersDto==null) return null;
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
            
            return objectMapper.convertValue(usersDto,UsersEntity.class);
        }
    ずっと簡単になりました.ObjectMapperでシーケンス化と逆シーケンス化を設定し、convertValue(変換するオブジェクト、変換するクラス)メソッドを使用します.
    シリアル化設定はNull値でシリアル化されず、逆シリアル化設定はターゲットクラスに宣言された変数がない場合に変換されません.
    コードは短く見えないかもしれませんが、変数が多ければ多いほど、減少するコード量が多くなります.
    長所
  • コード量が大幅に減少しました.
  • 短所
  • は、すべてのdtoまたはエンティティに設定する必要があります.
  • 外来鍵によってバンドルされた他のエンティティまたはdtoは変換されません.
  • 例で作成したentityに関係のないテーブル.TOYプロジェクトで作成しても,ユーザ情報を含むエンティティが関係しないことはほとんどない.
  • testDto
  • @Data
    public class TestDto {
    	private int i1=0;
    	private String s1="";
    	private float f1 = 0;
     
        @Builder
        public TestDto(int i1, String s1,, float f1,) {
            this.i1 = i1;
            this.s1 = s1;
            this.f1 = f1;
            
        }
    }
  • ユーザーDto->外部キーを追加
  • @Data
    @NoArgsConstructor
    public class UsersDto {
    
        private int id;
        private String token;
        private String password;
        private Date regDate;
        private String email;
        
        private TestDto testDto;
    
        @Builder
        public UsersDto(int id, String token, String password, Date regDate, String email,TestDto testDto) {
            this.id = id;
            this.token = token;
            this.password = password;
            this.regDate = regDate;
            this.email = email;
            this.testDto = testDto;
        }
    // 1편에서 사용한 방식
    public static UsersEntity converter(UsersDto usersDto){
            // OneToOne관계의 테이블
            TestDto testDto = usersDto.getTestEntity();
        	TestEntity testEntity = testDto.builder()
                    .i1(testDto.getI1())
                    .s1(testDto.getS1())
                    .f1(testDto.getF1())
                    .build();
                    
            return UsersEntity.builder()
                    .token(usersDto.getToken())
                    .password(usersDto.getPassword())
                    .regDate(usersDto.getRegDate())
                    .email(usersDto.getEmail())
                    .testDto(testDto)
                    .build();
        }
        
       public static UsersEntity mapper(UsersDto usersDto){
            if(usersDto==null) return null;
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
            UsersEntity usersEntity = objectMapper.convertValue(usersDto,UsersEntity.class);
            TestDto testDto = objectMapper.convertValue(testDto, TestEntity);
            usersEntity.setTestDto(testDto);
            return usersEntity;
        }
    以上のように,外部キーが長ければ長いほどコード量が大きくなり@Builder方式は断念する.2つ目の方法は,コードを繰り返すたびにトラブルを解決しようとし,JENNERIC法を用いて試みた.