GAE Spring DispatcherServlet可以将不同的数据对象保存到同一个PersistenceManagerFactory吗?

时间:2014-11-18 20:04:32

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

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

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

我用这个项目作为我自己的基础:
https://github.com/juleswhite/mobilecloud-14/tree/master/examples/12-VideoSvcAppEngineJDO 版权所有2014,Jules White

我承认,虽然我是一名经验丰富的C ++开发人员,但我对此处尝试使用的任何技术/工具几乎没有任何经验。我已经筋疲力尽,试图解决这个问题,我无法确定错误在哪里。我有一个部分工作的项目,很乐意发布您认为有用的任何其他代码。

主题1:

首先让我从设计的基本假设开始。我理解一个PersistenceManagerFactory应该能够处理许多不同的JDO类。在我的例子中,我有一个看护者对象和一个患者对象,每个对象都标有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;
}
...

现在,当我发布或获取Patient Objects时,我的结果始终为null。

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正确处理Patient对象吗? 非常感谢您的时间。

1 个答案:

答案 0 :(得分:0)

@Body Annotation用于Retrofit ..你的服务应该使用@RequestBody Annotation来获取数据对象..这就是为什么服务器永远不会存储任何内容然后返回Null ...