2017-03-16 3 views
1

Web/JSONリクエストの場合、ドメインモデル全体をクライアントに公開したくありません。この場合のパターンの1つは、DTOオブジェクトを使用し、次にドメインモデルからDTOにマッピングして戻すことです。DTOオブジェクトを作成しないJSONリクエストからドメインモデルを保護できますか?

DTOの例は、JSONリクエストで使用されるLoginUserDTOです:

public class LoginUserDTO { 
    private String email; 
    private String password; 
} 

加えて、我々はより多くの特性を持つエンティティとして注釈ユーザーPOJOを持っています。 LoginUserDTOを使用することにより、更新されるUserエンティティの他のフィールドを保護します

しかし、複数のDTOを持つとコードの繰り返しが発生しますが、この繰り返しは避けられますか? SpringデータでSpring/Hibernateを使用しています

答えて

1

これはもっとコードですが、最終的にはそれに相当します。あなたのサービスがそのデータを「所有」すると想定されている場合、そのサービスはエンドユーザから抽象化された状態に保たれるべきです。これは、クライアントにAPIを与えることを意味します。 APIにはDTOと関数があります。データレイヤーには独自のモデルがあります。

時系列データの保存を開始する場合は、すべてのクライアントがそれを知る必要はありません。または、テーブルにフィールドを追加または削除する必要があります。あるいは、それほど頻繁にクエリを実行しないようにするために、派手な結合を書いておきたい。これらのすべてのことは、2つのオブジェクトセットがない場合は、ユーザー向けのAPIを変更することを意味します。

DTOとモデルのほかに、コンバータも必要です。あなたにとってラッキーですが、Springは、使用するパターン/クラスが用意されています。

import com.example.dto.LoginUserDto; 
import com.example.model.LoginUser; 
import org.springframework.core.convert.converter.Converter; 

public class LoginUserDtoToLoginUserConverter 
    implements Converter <LoginUserDto, LoginUser> { 

    @Override 
    public LoginUser convert(LoginUserDto source) { 
    if (source == null) { 
     return null; 
    } 
    LoginUser target = new LoginUser(); 
    target.setEmail(source.getEmail()); 
    target.setPassword(source.getPassword()); 
    return target; 
    } 
} 

楽しみはまだ終わっていません!モデルオブジェクトに変換する必要があります。これは、オブジェクトをクライアントに返すときにDTOに変換されます。わーい!

import com.example.dto.LoginUserDto; 
import com.example.model.LoginUser; 
import org.springframework.core.convert.converter.Converter; 

public class LoginUserToLoginUserDtoConverter 
    implements Converter <LoginUser, LoginUserDto> { 

    @Override 
    public LoginUserDto convert(LoginUser source) { 
    if (source == null) { 
     return null; 
    } 
    LoginUserDto target = new LoginUserDto(); 
    target.setEmail(source.getEmail()); 
    target.setPassword(source.getPassword()); 
    return target; 
    } 
} 

美しいわけではありません。あまりにも多くの無駄。しかし、いいえ、これについて別の方法はありません。あなたは "ワイヤ"オブジェクトを保存するか、それらを変換します。

幸運のベスト。

1

スマートな解決策ではありませんが、特定の状況で役に立つと思われる人もいます。

JSONクラスを作成し、POJOクラスから拡張することができます。例えば;

public class LoginUserAsJSON { 
    private String email; 
    private String password; 
} 

public class LoginUserAsPOJO extends LoginUserAsJSON { 
    private int userId; 
    private Date loginTime; 
    ... 
} 
+0

JSONをPOJOに拡張しますか? –

+0

これは設計上の選択ですが、どちらも技術的には同等ですが、上記の例で述べたように、POJOクラスからJSONクラスを継承することは妥当です。 –

関連する問題