ajax post调用导致400(Bad Request)发送数组到spring rest controller

时间:2016-03-09 10:11:32

标签: javascript java jquery ajax spring

我将OneToMany映射为

@Entity
public class Foo implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long fooId;
    private String fooName;     

    @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
    private Set<Bar> bars = new HashSet<Bar>();

    // getters and setters go here
}

@Entity
public class Bar implements Serializable {     
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long barId;
    private String barTitle;
    private static final long serialVersionUID = 1L;
    @ManyToOne
    @JoinColumn(name = "fooId")
    private Foo foo;
    // getters and setters go here
}

我已经创建了一个FooRestController来使用ajax

来保存数据
@RequestMapping(value = "/foo/", headers="Accept=*/*", consumes="application/json", method = RequestMethod.POST)
    public ResponseEntity<Void> create(@RequestBody Foo foo) {           
        fooService.saveFoo(foo);
        Set<Bar> bars = foo.getBars();      

        for (Bar bar : bars) {
            barService.savebar(bar);            
        }       

        return new ResponseEntity<Void>(HttpStatus.CREATED);
    }

我的ajax POST请求是

var barArray = [];
bar[0] = "Bar1";
bar[1] = "Bar2";
$.ajax({
    contentType : 'application/json',
    crossDomain: true,
    type: 'POST',
    url: '/foo/',
    dataType : 'json',
    data : JSON.stringify({        
        'fooName' : 'A',
        'bars' : barArray // this line here causes error 
})

此时我收到错误

POST http://localhost:8080/name/foo/ 400 (Bad Request)

任何关于保存foo的barArray的建议。

注意

当我使用Postman发送数据时

{

    "fooName": "A",       
   "bars" : [
         {
            "barTitle" : "a"                
         }           
       ]
}

插入数据并在db。中创建新的foo。

1 个答案:

答案 0 :(得分:1)

至于我的方法,问题很明显,你应该发送barArray,因为你在邮递员发送它所以写这个代码

var barArray = [];
bar[0] = "Bar1";
bar[1] = "Bar2";
$.ajax({
    contentType : 'application/json',
    crossDomain: true,
    type: 'POST',
    url: '/foo/',
    dataType : 'json',
    data : JSON.stringify({        
        'fooName' : 'A',
        'bars' : [{
                 "barTitle" : bar[0], 
               },{
                 "barTitle" : bar[1], 
               }]
})

并在休息控制器中进行一些更改,以便以这种方式在fooId实体中保存Bar

@RequestMapping(value = "/foo/", headers="Accept=*/*", consumes="application/json", method = RequestMethod.POST)
    public ResponseEntity<Void> create(@RequestBody Foo foo) {           
        fooService.saveFoo(foo);
        Set<Bar> bars = foo.getBars();      

        for (Bar bar : bars) {
            bar.setFoo(foo); // this foo object comes from method arg @RequestBody Foo foo above
            barService.savebar(bar);            
        }       

        return new ResponseEntity<Void>(HttpStatus.CREATED);
    }

尝试一下,希望你现在没有看到400错误。