「リクエスト ファクトリ」の例が機能しており、それをリファクタリングして、「persist()」や「remove()」などの汎用メソッドをドメイン オブジェクトから汎用ロケーターに移動できるようにしたいと考えています。現在、私は次の(作業中の)コードを持っています:
すべてのドメイン オブジェクトの ID とバージョンを保持する汎用スーパー クラス:
@MappedSuperclass
public class EntityBase {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Version
@Column(name = "version")
private Integer version;
// setter & getter
}
ドメイン オブジェクト。クラスからリファクタリングしたいpersist()およびremove()メソッドがあります:
@Entity
@Table(name = "article")
public class Article extends EntityBase{
public static Article findArticle(Long id) {
//find article
}
public void persist() {
// persist
}
public void remove() {
// remove
}
}
ドメイン オブジェクトのプロキシ オブジェクト:
@ProxyFor(value = Article.class)
public interface ArticleProxy extends EntityProxy {
// some getter and setters
}
ドメイン オブジェクトのリクエスト オブジェクト:
@Service(value = Article.class)
public interface ArticleRequest extends RequestContext {
Request<ArticleProxy> findArticle(Long id);
InstanceRequest<ArticleProxy, Void> persist();
InstanceRequest<ArticleProxy, Void> remove();
}
私のリクエストファクトリー:
public interface MyRequestFactory extends RequestFactory {
ArticleRequest articleRequest();
}
------------------------------------------------------
今、もう機能していないリファクタリングされたコード:
ドメイン オブジェクトから persist() および remove() メソッドを削除しました。
@Entity
@Table(name = "article")
public class Article extends EntityBase{
public static Article findArticle(Long id) {
//find article
}
}
このようにロケーターを作成し、メソッド「remove()」と「persist()」をここに追加しました (他のデフォルト メソッドと一緒に):
public class EntityLocator extends Locator<EntityBase, Long> {
@Override
public EntityBase create(Class<? extends EntityBase> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
@Override
public EntityBase find(Class<? extends EntityBase> clazz, Long id) {
return null;
}
@Override
public Class<EntityBase> getDomainType() {
return null;
}
@Override
public Long getId(EntityBase domainObject) {
return null;
}
@Override
public Class<Long> getIdType() {
return null;
}
@Override
public Object getVersion(EntityBase domainObject) {
return null;
}
public void persist(EntityBase domainObject){
// persist something
}
public void remove(EntityBase domainObject){
// remove
}
}
私のプロキシ オブジェクトは、ロケーター (locator=EntityLocator.class) にリンクされています。
@ProxyFor(value = Article.class, locator=EntityLocator.class)
public interface ArticleProxy extends EntityProxy {
// getter and setters here
}
私の新しい Request オブジェクトは次のようになります。「InstanceRequests」を「Requests」に変更し、ロケーターの新しいメソッドに従って戻り値の型とパラメーターを変更しました。
@Service(value = Article.class)
public interface ArticleRequest extends RequestContext {
Request<ArticleProxy> findArticle(Long id);
Request<Void> persist(ArticleProxy article);
Request<Void> remove(ArticleProxy article);
}
しかし、persist() および remove() メソッドについて、「java.lang.Void persist() に似たドメイン メソッドが見つかりませんでした」というエラーが表示されます。EntityLocator でのルックアップが機能しないのはなぜですか? ServiceLocator は必要ですか? Google チュートリアルを完全には理解できず、リンクされた例はもう利用できません。