我想使用Spring将HTML表单(使用AngularJS)中的一些数据存储到我的数据库中。
为此,我将@RequestBody
注释与POJO一起使用,但我无法使其工作:我的POJO已经实现,但看起来POJO属性未映射到我的表单值(它们都是空的。)
控制器:
@RequestMapping(value = "/createEntities", method = RequestMethod.POST)
@ResponseBody
public List<Entity> createEntities(@RequestBody final EntityList resource, @RequestParam final String kind) {
System.out.println("Creating entity for: " + kind);
Preconditions.checkNotNull(resource);
List<Entity> newEntities = new ArrayList<Entity>();
System.out.println("Entity test = " + resource.getTest()); // Prints "Entity test = null"
// Code below returns NullException
//System.out.println("Entity list nb = " + resource.getEntity().size());
if (resource.getEntities() != null && !resource.getEntities().isEmpty()) {
System.out.println("Entity list is OK");
for (EntityForm eForm : resource.getEntities()) {
if (eForm.getGrant() != null) {
Entity ent = new Entity();
if ("RTS".equals(kind)) {
ent.setDept(deptService.findByAbr(DeptEnum.RTS.name()));
} else {
ent.setDept(deptService.findByAbr(DeptEnum.RTB.name()));
}
ent.setGrant(eForm.getGrant());
ent.setCountry(eForm.getCountry());
ent.setName(eForm.getName());
ent = service.create(ent);
newEntities.add(ent);
}
}
}
return newEntities;
}
EntityList
是我表单的POJO。此POJO包含EntityForm
的列表(+用于测试目的的字符串),它是我的数据库实体Entity
的DTO。
EntityList POJO:
public class EntityList implements Serializable {
private static final long serialVersionUID = 6335318686899794229L;
private List<EntityForm> entities;
private String test;
public EntityList() {
super();
}
public EntityList(List<EntityForm> entities, String test) {
super();
this.entities = entities;
this.test = test;
}
public List<EntityForm> getEntities() {
return entities;
}
public void setEntities(List<EntityForm> entities) {
this.entities = entities;
}
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}
我认为问题来自我的表单中的实体列表与我的POJO中的List<EntityForm>
之间的错误映射,这就是为什么我在我的POJO中添加了一个简单的字符串。
AngularJS方
服务:
app.factory("Entities", function($resource) {
return $resource("api/auth/entities", null,
{
createEntities: {method:'POST', url: "api/auth/entities/createEntities", params: { kind: '@kind' }, isArray:true}
});
})
控制器:
$scope.EntForm = {};
$scope.EntForm.entities = [];
$scope.EntForm.test = "myTest";
/* ... */
$scope.saveEnt= function() {
console.log($scope.EntForm);
Entities.createEntities($scope.EntForm,{kind:"RTS"},function(res) {
var msg = 'Entities created...';
ngToast.create(msg);
$location.path("/entities");
});
}
在我的firefox控制台中,我看到$scope.EntForm
已正确设置(我的所有实体对象都设置了字段,以及控制器中定义的测试字符串。)
结果
所有这些代码都会显示:
Creating entity for: RTS
Entity test = null
我做错了什么?
答案 0 :(得分:0)
您是否使用Firefox开发人员工具查看了POST有效内容,自定义createEntities
方法是否正常工作?
(会添加此作为评论,但遗憾的是我还没有足够的声誉。)
答案 1 :(得分:0)
我不得不从Spring控制器中移除@RequestParam final String kind
部分,以及AngularJS代码中的参数。
为了得到那种,我刚刚在我的AngularJS控制器中添加了$scope.EntForm.kind = "theValueIWant"
。
我不知道这是否是一种很好的方法,可以让它在良好实践中发挥作用,但我现在得到了@RequestBody
内容。