gpt4 book ai didi

java - GWT 请求工厂 - 如何让定位器工作

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:25 25 4
gpt4 key购买 nike

我有一个有效的“请求工厂”示例,我想重构它,以便我可以将“persist()”和“remove()”等通用方法从域对象移到通用定位器中。目前我有以下(工作)代码:

保存所有域对象的 ID 和版本的通用父类(super class):

@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

}

我的新请求对象如下所示。我将“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 吗?我没有完全理解谷歌教程,链接的示例不再可用。

最佳答案

我和你有同样的问题。 GWTProject.org ( http://www.gwtproject.org/doc/latest/DevGuideRequestFactory.html ) 上的指南对于如何正确实现这一点并不是很清楚,尽管它是写在字里行间的。

以下教程让我​​清楚地了解了解决方案:http://cleancodematters.com/2011/06/04/tutorial-gwt-request-factory-part-i/

对我来说,DAO 这个术语的使用混淆了事物。我不会使用 DAO 模式。这就是我的透明持久层的用途。然而,使用 Locator 需要一个额外的类来放入 persist、remove 和 findX 方法。他们称其为数据访问对象(实际上确实如此),我宁愿称其为 Manager。

tl;博士

您尝试放入定位器中的方法不会到达那里。您需要一个额外的类(将其称为 DAO 或 Manager)。

在 RequestContext 中使用 DAO/Manager 作为服务

关于java - GWT 请求工厂 - 如何让定位器工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16800675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com