Dozer を使用して、ドメイン エンティティを DTO オブジェクトに変換しようとしています。だから、PersistentList、PersistentBag、...を私のドメインエンティティからArrayListに変換したい...私のDTOオブジェクトでは、怠惰な問題を避けることができます。
これは、私のドメイン エンティティの 2 つの例です。
public class User {
private Collection<Role> roles;
...
}
public class Role {
private Collection<User> users;
...
}
クラスがDTO型であることを除いて、私のDTOオブジェクトは同じです。したがって、ドメインを DTO オブジェクトに変換するには、次の Dozer マッピングを使用します。
<configuration>
<custom-converters>
<converter type=com.app.mapper.converter.BagConverter">
<class-a>org.hibernate.collection.PersistentBag</class-a>
<class-b>java.util.List</class-b>
</converter>
</custom-converters>
</configuration>
<mapping>
<class-a>com.app.domain.User</class-a>
<class-b>com.app.dto.UserDTO</class-b>
</mapping>
<mapping>
<class-a>com.app.domain.Role</class-a>
<class-b>com.app.dto.RoleDTO</class-b>
</mapping>
BagConverter は Dozer カスタム コンバーターであり、それがそのコードです。
public class BagConverter<T> extends DozerConverter<PersistentBag, List>{
public BagConverter() {
super(PersistentBag.class, List.class);
}
public PersistentBag convertFrom(List source, PersistentBag destination) {
PersistentBag listDest = null;
if (source != null) {
if (destination == null) {
listDest = new PersistentBag();
} else {
listDest = destination;
}
listDest.addAll(source);
}
return listDest;
}
public List convertTo(PersistentBag source, List destination) {
List listDest = null;
if (source != null) {
if (destination == null) {
listDest = new ArrayList<T>();
} else {
listDest = destination;
}
if (source.wasInitialized()) {
listDest.addAll(source);
}
}
return listDest;
}}
したがって、ロールを持つ PersistentBag を含む User オブジェクトを取得します。そのオブジェクトに dozer マッパー マップを適用して、UserDTO オブジェクトを取得します。取得した結果は、Role の ArrayList を持つ UserDTO オブジェクトであり、RoleDTO の ArrayList はありません。
カスタム コンバーターを使用しても、dozer はリストの内容を変換してくれると思いました。それは正しい方法ではありませんか?いいえの場合、永続的なコレクションを従来の Java コレクションに置き換えて、ドメイン エンティティを dto オブジェクトに変換するにはどうすればよいですか?
ご協力いただきありがとうございます。
シルヴァン。