我正在开发一个部署到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 ++开发人员,但我对此处尝试使用的任何技术/工具几乎没有任何经验。我已经筋疲力尽,试图解决这个问题,我无法确定错误在哪里。我有一个部分工作的项目,很乐意发布您认为有用的任何其他代码。
首先让我从设计的基本假设开始。我理解一个PersistenceManagerFactory应该能够处理许多不同的JDO类。在我的例子中,我有一个看护者对象和一个患者对象,每个对象都标有DataNucleus Annotation。
@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>();
}
...
@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扩展到多种数据类型。
....
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;
}
....
/*
* @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对象。
....
// 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":[]}]
如果我将相同的方法应用于我的患者对象
...
// 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不知道如何解释患者对象一样。
如果我确实正确使用了PersistenceManagerFactory。还有什么需要做的才能让PersistenceManagerFactory正确处理Patient对象吗? 非常感谢您的时间。
答案 0 :(得分:0)
@Body Annotation用于Retrofit ..你的服务应该使用@RequestBody Annotation来获取数据对象..这就是为什么服务器永远不会存储任何内容然后返回Null ...