【问题标题】:Can a GAE Spring DispatcherServlet save different Data Objects to the same PersistenceManagerFactory?GAE Spring DispatcherServlet 可以将不同的数据对象保存到同一个 PersistenceManagerFactory 吗?
【发布时间】:2015-01-16 03:42:49
【问题描述】:

我正在开发一个部署到 Google App-Engine 的 Spring DispatcherServlet,它使用 JDO PersistenceManagerFactory 进行存储。

我正在使用 Eclipse Maven 插件和 Maven appengine 插件的组合在 Eclipse 中进行开发。 (我没有安装适用于 Eclipse 的 Google App Engine 插件,因为我没有成功让该设置正常工作。)

我已将此项目用作我自己的基础:
https://github.com/juleswhite/mobilecloud-14/tree/master/examples/12-VideoSvcAppEngineJDO 版权所有 2014,朱尔斯·怀特

我承认,尽管我是一位经验丰富的 C++ 开发人员,但我对我在这里尝试使用的任何技术/工具几乎没有经验。我已经筋疲力尽地试图弄清楚这一点,我不能确定错误在哪里。我有一个部分工作的项目,很乐意发布您认为有帮助的任何其他代码。

主题一:

让我从我的设计的一个基本假设开始。我的理解是一个 PersistenceManagerFactory 应该能够处理许多不同的 JDO 类。在我的示例中,我有一个 Caregiver 对象和一个 Patient 对象,每个对象都使用 DataNucleus Annotation 进行了标记。

Caregiver.java

@PersistenceCapable
public class Caregiver {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private String firstName;

    @Persistent
    private String lastName;

    @Persistent
    private String phone;

    @Persistent
    private String email;

    @Persistent
    public ArrayList<Long> patients;

    public Caregiver() {
        patients = new ArrayList<Long>();
    }
    ...

Patient.java

@PersistenceCapable
public class Patient {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long sysId;

    @Persistent
    private Long caregiverId;

    @Persistent
    private String firstName;

    @Persistent
    private String lastName;

    @Persistent
    private String recordNum;

    @Persistent
    private String dob;

    @Persistent
    private ArrayList<Long> checkIns;

    @Persistent
    private ArrayList<Long> meds;

    public Patient() {
        checkIns = new ArrayList<Long>();
        meds = new ArrayList<Long>();
    }
    ...

我通过和改编 Dr. Whites Code 中提供的接口访问 PersistenceManagerFactory。我的适应应该是将 PMF 扩展到多种数据类型。

JDOCrudRepository.java

....
public Object save(Object entity) {
    return PMF.get().getPersistenceManager().makePersistent(entity);
}
....
public Iterable<Object> findAll(Class<?> type) {
    Query query = PMF.get().getPersistenceManager().newQuery(type);
    Object rslt = query.execute();
    return (Collection<Object>) rslt;
}
....

PMF.java

/*
 * @author jules
 * 
 */
public final class PMF {
     private final PersistenceManagerFactory pmfInstance = JDOHelper
                .getPersistenceManagerFactory("transactions-optional");

     public PMF() {
     }

     public PersistenceManagerFactory get() {
          return pmfInstance;
     }
}

我能够使用命令“mvn appengine:dev_server”构建和测试项目 使用我的 spring dispatcherServlet 我有有线函数可以从 PersistenceManagerFactory 添加和检索 Caregiver 对象。

CaregiverService.java

....
// GET ////////////////////////////////////////////////////////////////////
// TODO: Dangerous in production
@Override
@RequestMapping(value = CaregiverSvcApi.CAREGIVER_SVC_PATH, method = RequestMethod.GET)
public @ResponseBody
Collection<Caregiver> getCaregiverList() {
    ArrayList<Object> objList = Lists.newArrayList(repo
            .findAll(Caregiver.class));

    ArrayList<Caregiver> cg = new ArrayList<Caregiver>();
    for (Object object : objList) {
        cg.add(object != null ? (Caregiver) object : null);
    }

    return cg;
}
...
// POST ///////////////////////////////////////////////////////////////////
@Override
@RequestMapping(value = CaregiverSvcApi.CAREGIVER_SVC_PATH, method = RequestMethod.POST)
public @ResponseBody
Caregiver postCaregiver(@RequestBody Caregiver cg) {
    cg.setIdNull();
    Caregiver newCg = (Caregiver) repo.save(cg);
    return newCg;
}
...

从我的开发服务器获取的结果证明这些工作正常

GET http://127.0.0.1:8080/caregiver
[{"id":5676073085829120,"firstName":"Cg","lastName":"One","phone":"1234567","email":"1@x.com","patients":[]},
{"id":5682617542246400,"firstName":"z","lastName":"z","phone":"123","email":"z@z.com","patients":[]},
{"id":5715999101812736,"firstName":"c","lastName":"s","phone":"123","email":"c@s.com","patients":[]}]

问题的本质……

如果我将相同的方法应用于我的患者对象

CaregiverSvc.java

...
// GET ////////////////////////////////////////////////////////////////////
@Override
@RequestMapping(value = CaregiverSvcApi.PATIENT_SVC_PATH, method = RequestMethod.GET)
public @ResponseBody
Collection<Patient> getPatientList() {
    ArrayList<Object> objList = Lists.newArrayList(repo
            .findAll(Patient.class));

    ArrayList<Patient> p = new ArrayList<Patient>();
    for (Object object : objList) {
        p.add(object != null ? (Patient) object : null);
    }

    return p;
}
...
// POST ///////////////////////////////////////////////////////////////////
@Override
@RequestMapping(value = CaregiverSvcApi.PATIENT_SVC_PATH, method = RequestMethod.POST)
public @ResponseBody
Patient postPatient(@Body Patient p) {
    p.setIdNull();
    Patient newP = (Patient) repo.save(p);
    return newP;
}
...

现在,当我发布或获取患者对象时,我的结果始终为空。

GET http://127.0.0.1:8080/patient
[{"id":5113123132407808,"caregiverId":null,"firstName":null,"lastName":null,"recordNum":null,"dob":null,"checkIns":[],"meds":[]},
{"id":5697423099822080,"caregiverId":null,"firstName":null,"lastName":null,"recordNum":null,"dob":null,"checkIns":[],"meds":[]}]

我的所有患者对象都存储为空值,就好像我的 PersistenceManagerFactory 不知道如何解释患者对象一样。

主题 2:

如果我确实正确地使用了 PersistenceManagerFactory。为了让 PersistenceManagerFactory 正确处理患者对象,我还需要做些什么吗?
非常感谢您的宝贵时间。

【问题讨论】:

  • 当您归还它们时,这些对象处于什么状态?空洞的 ?短暂的?日志会告诉你。数据库会告诉您实际保存的内容(日志也会告诉您)
  • 我得到了一个看起来像病人对象的东西,它有一个有效的键和从我的保存函数返回的空成员。应用引擎管理面板报告相同。

标签: spring google-app-engine maven spring-mvc jdo


【解决方案1】:

@Body Annotation 用于 Retrofit.. 你的 Service 应该使用 @RequestBody Annotation 来获取 Data Object.. 这就是为什么服务器从不存储任何东西并因此返回 Null...

【讨论】:

  • 你是对的!非常感谢你让我重回正轨。
猜你喜欢
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多