【问题标题】:NullPointerException when saving to GAE with RequestFactory使用 RequestFactory 保存到 GAE 时出现 NullPointerException
【发布时间】:2013-07-19 17:29:34
【问题描述】:

我正在尝试使用 objectify 持久化一个简单的类,但没有成功。

为这篇长文道歉,但我认为信息多于少。

我效仿了 David M. Chandler 的例子:

http://turbomanage.wordpress.com/2011/03/25/using-gwt-requestfactory-with-objectify/

但我不断收到 NullPointerException。

我不知道我做错了什么,但我使用的类如下:

我的代理,DatastoreObjectProxy:

@ProxyFor(value = DatastoreObject.class, locator = ObjectifyLocator.class)
public interface DatastoreObjectProxy extends EntityProxy{

    Long getId();
    void setId(Long id);
    Integer getVersion();
    void setVersion(Integer id);

}

和BeingProxy:

@ProxyFor(value = Being.class, locator = ObjectifyLocator.class)
public interface BeingProxy extends DatastoreObjectProxy {

    String getName();
    void setName(String name);
    String getFiscalNumber();
    void setFiscalNumber(String fiscalNumber);

}

和我的请求工厂:

public interface MyRequestFactory extends RequestFactory{

    @Service(value = BeingDao.class, locator = DaoServiceLocator.class)
    interface BeingRequestContext extends RequestContext {
        Request<List<BeingProxy>> listAll();
        Request<Void> save(BeingProxy being);
        Request<BeingProxy> saveAndReturn(BeingProxy being);
        Request<Void> removeBeing(BeingProxy being);
    }

    BeingRequestContext beingRequestContext();

}

最后,我的 UI 使用以下代码来创建和检索 Being 实体:

@UiHandler("btnAdd") void onBtnAddClick(ClickEvent 事件) {

    //Validate name
//TODO warn user if invalid
if (txtName==null||txtName.getText().equals("")){return;}
String n = txtName.getText();

//Validate fiscal number
//TODO warn user if invalid
if (txtFiscalNumber==null||txtFiscalNumber.getText().equals("")){return;}
String fn = txtFiscalNumber.getText();

BeingRequestContext reqCtx = rf.beingRequestContext();
final BeingProxy being = reqCtx.create(BeingProxy.class);
being.setName(n);
being.setFiscalNumber(fn);

Request<BeingProxy> saveRequest = reqCtx.saveAndReturn(being);
saveRequest.fire(new Receiver<BeingProxy>(){
    @Override
    public void onSuccess(BeingProxy response) {
        addToList(response);
    }
});

这会引发前面提到的异常。

我注意到服务器代码是按注释执行的。所以我猜问题出在请求工厂或客户端。但是我检查了三遍代码,没有发现任何问题。

感谢您的宝贵时间。

最好的问候。

【问题讨论】:

  • 那是一大堆代码,我什至不会费心去筛选那个。缩小一点。
  • 如果您尽最大努力将代码范围缩小到几个相关的方法,您将有 更多 更多的运气来帮助您。
  • @HenryHarris 我稍微修改了代码。我希望现在好些了。

标签: java requestfactory objectify


【解决方案1】:

我想出了这个。我没有正确初始化请求工厂。我必须使用事件总线对其进行初始化:

final MyRequestFactory rf = GWT.create(MyRequestFactory.class);

        EventBus eventBus = new SimpleEventBus();
        rf.initialize(eventBus);

【讨论】:

    【解决方案2】:

    您需要在 objectify 服务中注册您的对象类,以便定位器找到它们。

    在声明类后立即在 ObjectifyLocator.java 中添加以下代码:

    public class ObjectifyLocator {
        static {
           ObjectifyService.register(DatastoreObject.class);
           ObjectifyService.register(Being.class);
         }
    
    }
    

    【讨论】:

    • 我不知道我是否做得对,但我在我的自定义 OfyService(扩展 ObjectifyService)中注册了实体类(在这种情况下,只有存在是一个实体)。不过,我尝试按照您所说的在我的 ObjectifyLocator 中注册这两个类,但没有运气。还有什么建议吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-04-02
    • 2012-10-05
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多