【发布时间】:2015-04-08 08:09:49
【问题描述】:
我想使用 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
我做错了什么?
【问题讨论】:
标签: angularjs spring spring-mvc jakarta-ee