1

「リクエスト ファクトリ」の例が機能しており、それをリファクタリングして、「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 チュートリアルを完全には理解できず、リンクされた例はもう利用できません。

4

4 に答える 4

0

インターフェイス ArticleRequest が正しく構成されていません。このように修正する必要があります。

@Service(value = SentenceServiceImpl.class, locator = SpringServiceLocator.class)
public interface SentenceServiceRequest extends RequestContext {

    Request<List<SentenceProxy>> getSentences();

    Request<Void> saveOrUpdate(SentenceProxy sentence);

}

ロケータ:

public class SpringServiceLocator implements ServiceLocator {

    public Object getInstance(Class<?> clazz) {
        ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(RequestFactoryServlet.getThreadLocalServletContext());
        return context.getBean(clazz);
    }

}
于 2013-05-30T06:19:58.017 に答える
0

persist()とがロケーターにあったことは理にかなっていますremove()が、エンティティは永続レイヤーについて完全に不可知であったため、これは現在の RF API ではサポートされていません。結果として、これらのメソッドをロケーターに追加BaseEntityし、ロケーターで永続メソッドを呼び出す方法を考え出すことに対処する必要があります。

ただし、この機能を必要とする gwt の問題を開くことができると思います。

エンティティに特定のメソッドを持たないようにする別の方法は、代わりにを使用するValueProxyことEntityProxyですが、この場合、クライアントからそれらのオブジェクトを保存/削除するメソッドを提供する必要があります。

于 2013-05-29T14:11:14.057 に答える