- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正面临 gwt 问题 5794:http://code.google.com/p/google-web-toolkit/issues/detail?id=5794
我看到有一个 8 个月大的补丁,但它还没有包含在 gwt 2.5 RC1 中 http://gwt-code-reviews.appspot.com/1620804/
有谁知道这个补丁是否会包含在 gwt 2.5 rc2 或最终版本中?
如果没有,有人可以向我解释什么是该问题的最佳解决方法。
提前致谢。
最佳答案
我从 AbstractRequestContext 的 copyBeanAndCollections 方法中想到了这个。它似乎完成了我想要使用新上下文将代理克隆到另一个代理的工作。这本质上要求您首先创建一个新代理或使用新上下文编辑代理,但我不再需要使用复制构造函数将属性迭代复制到新代理。我仍在测试,但我创建了一个简单的 GWTTestCase,它似乎可以正常工作。
快速更新
我解决了请求工厂实体定位器无法解析类型的问题,因此我重新添加了 stableid 和版本标签以进行克隆。这可能是个坏主意,当我弄清楚稳定 id 是否用于原始对象的实际引用的类类型时,我会更新。我的猜测是它用于在服务器端解析类型。
public class ProxyUtils {
public static <T extends BaseProxy> AutoBean<T> cloneBeanProperties(final T original, final T clone, final RequestContext toContext) {
AutoBean<T> originalBean = AutoBeanUtils.getAutoBean(original);
AutoBean<T> cloneBean = AutoBeanUtils.getAutoBean(clone);
return cloneBeanProperties(originalBean, cloneBean, toContext);
}
/**
* Shallow-clones an autobean and makes duplicates of the collection types.
* A regular {@link AutoBean#clone} won't duplicate reference properties.
*/
public static <T extends BaseProxy> AutoBean<T> cloneBeanProperties(final AutoBean<T> toClone, final AutoBean<T> clone, final RequestContext toContext) {
// NOTE: This may be a bad idea, i don't know if the STABLE_ID is the type or if it is the
// actual server side reference to this object. Don't want it to update my original object.
// I added this back in because I was getting an InstantionException in the locator I am
// pretty sure this is because request factory server side could not resolve the class type.
// Maybe someone could shed some light on this one, if you know what the stable id is really
// used for.
clone.setTag(STABLE_ID, toClone.getTag(STABLE_ID));
clone.setTag(Constants.VERSION_PROPERTY_B64, toClone.getTag(Constants.VERSION_PROPERTY_B64));
clone.accept(new AutoBeanVisitor() {
final Map<String, Object> values = AutoBeanUtils.getAllProperties(toClone);
@Override
public boolean visitCollectionProperty(String propertyName, AutoBean<Collection<?>> value, CollectionPropertyContext ctx) {
// javac generics bug
value = AutoBeanUtils.<Collection<?>, Collection<?>> getAutoBean((Collection<?>) values.get(propertyName));
if (value != null) {
Collection<Object> collection;
if (List.class == ctx.getType()) {
collection = new ArrayList<Object>();
} else if (Set.class == ctx.getType()) {
collection = new HashSet<Object>();
} else {
// Should not get here if the validator works correctly
throw new IllegalArgumentException(ctx.getType().getName());
}
if (isValueType(ctx.getElementType()) || isEntityType(ctx.getElementType())) {
/*
* Proxies must be edited up-front so that the elements
* in the collection have stable identity.
*/
for (Object o : value.as()) {
if (o == null) {
collection.add(null);
} else {
collection.add(editProxy(toContext, (Class<T>) ctx.getType(), (T) o));
}
}
} else {
// For simple values, just copy the values
collection.addAll(value.as());
}
ctx.set(collection);
}
return false;
}
@Override
public boolean visitReferenceProperty(String propertyName, AutoBean<?> value, PropertyContext ctx) {
value = AutoBeanUtils.getAutoBean(values.get(propertyName));
if (value != null) {
if (isValueType(ctx.getType()) || isEntityType(ctx.getType())) {
/*
* Value proxies must be cloned upfront, since the value
* is replaced outright.
*/
@SuppressWarnings("unchecked")
AutoBean<BaseProxy> valueBean = (AutoBean<BaseProxy>) value;
ctx.set(editProxy(toContext, (Class<T>) ctx.getType(), (T) valueBean.as()));
} else {
ctx.set(value.as());
}
}
return false;
}
@Override
public boolean visitValueProperty(String propertyName, Object value, PropertyContext ctx) {
ctx.set(values.get(propertyName));
return false;
}
});
return clone;
}
/**
* Take ownership of a proxy instance and make it editable.
*/
private static <T extends BaseProxy> T editProxy(RequestContext ctx, Class<T> clazz, T object) {
AutoBean<T> toClone = AutoBeanUtils.getAutoBean(object);
// Create editable copies
AutoBean<T> parent = toClone;
AutoBean<T> clone = (AutoBean<T>) ctx.create(clazz);
AutoBean<T> cloned = cloneBeanProperties(toClone, clone, ctx);
cloned.setTag(Constants.PARENT_OBJECT, parent);
return cloned.as();
}
private static boolean isEntityType(Class<?> clazz) {
return isAssignableTo(clazz, EntityProxy.class);
}
private static boolean isValueType(Class<?> clazz) {
return isAssignableTo(clazz, ValueProxy.class);
}
public static boolean isAssignableTo(Class<?> thisClass, Class<?> assignableTo ) {
if(thisClass == null || assignableTo == null) {
return false;
}
if(thisClass.equals(assignableTo)) {
return true;
}
Class<?> currentSuperClass = thisClass.getSuperclass();
while(currentSuperClass != null) {
if(currentSuperClass.equals(assignableTo)) {
return true;
}
currentSuperClass = thisClass.getSuperclass();
}
return false;
}
}
这是我成功完成的简单单元测试。我确实有一些错误,我必须在 isAssignableFrom 方法中进行调查。
public void testCloneProxy() {
DaoRequestFactory requestFactory = GWT.create(DaoRequestFactory.class);
RequestContext fromContext = requestFactory.analyticsTaskRequest();
AnalyticsOperationInputProxy from = fromContext.create(AnalyticsOperationInputProxy.class);
from.setDisplayName("DISPLAY 1");
from.setInputName("INPUT 1");
RequestContext toContext = requestFactory.analyticsTaskRequest();
AnalyticsOperationInputProxy to = toContext.create(AnalyticsOperationInputProxy.class);
ProxyUtils.cloneBeanProperties(from, to, toContext);
System.out.println("Cloned output " + to.getDisplayName());
System.out.println("Cloned output " + to.getInputName());
Assert.assertTrue("Display name not equal" , from.getDisplayName().equals(to.getDisplayName()));
Assert.assertTrue("Input name not equal" , from.getInputName().equals(to.getInputName()));
}
关于gwt - Requestfactory 克隆代理到新上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12462174/
我想在 Ubuntu 12.04 的 Springsource Tool Suite 2.9.1 中使用 Spring ROO 1.2.1 + GWT 2.6.1。遵循 http://www.byte
您目前是否将命令模式与 RequestFactory 结合使用?我想使用它,但由于 RequestFactory 不允许继承,我不确定该怎么做。 如果有人遇到过这个问题并找到了实现它的方法,我会很高兴
我正面临 gwt 问题 5794:http://code.google.com/p/google-web-toolkit/issues/detail?id=5794 我看到有一个 8 个月大的补丁,但
我的 GWT 应用程序有十种不同的实体。现在我使用普通的旧 DTO 并通过 GWT-RPC 传输它们。这适用于像启动这样的情况——我可以将它们全部打包到一个请求中。 我正在考虑切换到 RequestF
有没有办法使用 RequestFactory 在单个请求中创建两个实体?我试过: EmployeeRequest request = requestFactory.employeeReques
我需要将 GWT 与基于服务的域层一起使用——而不是使用带有 DAO 的 bean。具有 MVP 和 RequestFactory 的 GWT 2.1 架构是否适合此?还是我应该继续使用 RPC? 谢
你知道我在哪里可以找到新的 GWT 2.1 RequestFactory 的一些代码示例吗?谷歌的教程一开始还不够好。 最佳答案 请检查这个 http://javaasylum.blogspot.co
我想产生以下行为: 用户在浏览器中保存一些实体。在服务器端保存实体后,它会生成通知,并且它必须通过带有更新的实体实例的 Atmosphere 通知所有其他客户端。 所以问题是如何通过Atmospher
我需要一些关于如何最好地使用 GWT 的 RequestFactory 处理将实体的服务器端更改传播到客户端的建议。 让我们假设我们有两个 EntityProxies,一个 PersonProxy 和
您能否告诉我如何让 RequestFactory 填充我的实体代理的字段(这些字段也是实体代理)? 这是父代理 @ProxyFor(value = Organization.class, locato
我尝试创建一个请求,使用 RequestFactory 并使用文件发布,但我没有收到 request.FILES。 from django.test.client import Request
RequestFactory 类中是否有一部分我可以覆盖以提供对某些请求的自动缓存?当然,我可以在 RF 外部进行缓存,但我想通过重写使其完全不可见来实现。 最佳答案 ServiceLayer.inv
我一直在使用 GWT 2.4 开发一个项目,并正在寻找一种方法来验证(JSR 303)我的客户端(代理)类,而无需从我的域类(服务器端)重新创建注释。我知道有一个示例与 GWT 中继代码(验证)一起提
是否可以向 GWT RequestFactory 的代理类添加方法?假设我有这个: @ProxyFor(value = MyEntity.class) interface MyEntityProxy
我正在使用 GWT RequestFactory。当我处于扩展 RemoteServiceServlet 的普通 RPC 类中时,我可以使用 this.getThreadLocalRequest()
有谁知道使用RequestFactory的GWT CellTable示例,并且正在编辑该表?我想列出表中的对象(每一行是一个对象,每一列是一个属性),能够轻松添加新对象并进行编辑。我知道Google的
我正在尝试使用 GWT 和 RequestFactory 构建一个简单的(只读)Web 应用程序,但我不知道如何摆脱以下警告: warning: The domain type DDisplay is
我开始开发一个相当大的GWT项目,它自然有一个数据模型。我想在客户端轻松地使用实体类。 我真的很喜欢吉利德,但是this thread对我来说这不是个好消息。 我不想使用RequestFactory,
在 GWT 应用程序中,我展示了可以由用户编辑的项目。加载和保存项目是使用 GWT 请求工厂执行的。我现在想要实现的是,如果两个用户同时编辑一个项目,则以乐观并发控制的方式先保存的用户获胜。这意味着当
我正在为 requestfactories 和泛型而苦苦挣扎。在下面的代码中,代理方法与实体方法完全匹配,但我得到了日志跟踪: java.lang.NullPointerException: null
我是一名优秀的程序员,十分优秀!