RequestBody POJO始终为空

时间:2015-04-08 08:09:49

标签: angularjs spring spring-mvc java-ee

我想使用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

我做错了什么?

2 个答案:

答案 0 :(得分:0)

您是否使用Firefox开发人员工具查看了POST有效内容,自定义createEntities方法是否正常工作?

(会添加此作为评论,但遗憾的是我还没有足够的声誉。)

答案 1 :(得分:0)

我不得不从Spring控制器中移除@RequestParam final String kind部分,以及AngularJS代码中的参数。 为了得到那种,我刚刚在我的AngularJS控制器中添加了$scope.EntForm.kind = "theValueIWant"

我不知道这是否是一种很好的方法,可以让它在良好实践中发挥作用,但我现在得到了@RequestBody内容。