【问题标题】:JSON to Java Object Mapping in Spring MVC results 400 (Bad Request)Spring MVC 中的 JSON 到 Java 对象映射结果 400(错误请求)
【发布时间】:2013-12-02 16:27:20
【问题描述】:

我在提交表单时收到 400(错误请求)错误。我正在使用 Jackson API jackson-core-asl-1.9.10.jar 和 jackson-mapper-asl-1.9.10.jar。

我可以接收 JSON 但无法提交。

myscript.js

var app = angular.module('project', ['ngRoute']);
app.controller('projectFormCtrl',["$scope", "$http", function($scope, $http) {

    $scope.submitProject = function() {
        console.log($scope.project); //Works fine
        $http.post('saveProject',$scope.project).success(function () {
            console.log($scope.project);
        });
    };

}]);

WebController.java

@RequestMapping(value="/saveProject", method=RequestMethod.POST)
public @ResponseBody ProjectDetails submitProject(@RequestBody ProjectDetails projectDetails) {
    System.out.println(projectDetails);
    return projectDetails;
}

【问题讨论】:

    标签: java json spring angularjs spring-mvc


    【解决方案1】:

    我也遇到过同样的Bad request问题。我通过执行以下代码解决了它。
    您可以通过 JSON.stringify(array) 将数组转换为 json 字符串来将数组发布到控制器。
    我已经使用 push() 将多个对象推送到一个数组中。

        var a = [];
        for(var i = 1; i<10; i++){
            var obj = new Object();
            obj.name = $("#firstName_"+i).val();
            obj.surname = $("#lastName_"+i).val();
            a.push(obj);
        }
    
        var myarray = JSON.stringify(a);
        $.post("/ems-web/saveCust/savecustomers",{myarray : myarray},function(e) {
    
        }, "json");
    

    控制器:
    您可以使用 jackson 来处理 json 字符串。
    Jackson 是一个高性能 JSON 处理器 Java 库。

        @RequestMapping(value = "/savecustomers", method = RequestMethod.POST)
        public ServiceResponse<String> saveCustomers(ModelMap model, @RequestParam String myarray) {
    
            try{
                ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); 
                List<DtoToMAP> parsedCustomerList = objectMapper.readValue(myarray, new TypeReference<List<DtoToMAP>>() { });
                System.out.println(" parsedCustomerList :: " + parsedCustomerList);
            }catch (Exception e) {  
                System.out.println(e);
            }
        }
    

    注意:确保您的 dto 应该包含与您使用数组对象发布的相同的变量名称。
    就我而言,我的 dto 包含 firstName,lastName,因为我使用数组对象发布。

    杰克逊依赖:

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.3</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.3</version>
        </dependency>
    

    【讨论】:

    • 嗨!接收 JSON 作为字符串工作得很好。谢谢!但是有什么方法可以自动映射到 java 对象?
    • 好的!我现在已经没有字符串了。问题是我的变量名称在前端的表单中不存在。这个问题现在已经解决了。谢谢。
    【解决方案2】:

    检查此sample 以查看 Spring MVC 配置以使用 json 映射器。

    【讨论】:

    • 我认为你没有真正回答,你保留它作为评论。
    • 我只能发布答案,此示例用于使用 JSon 请求配置 Spring MVC
    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 2015-09-22
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多