ajax post 调用导致将数组发送到弹簧休息控制器时出现 400(错误请求)

ajax post call causes 400 (Bad Request) on sending array to spring rest controller

本文关键字:控制器 请求 错误 调用 post 数组 ajax      更新时间:2023-09-26

我有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)

任何保存酒吧的建议福数组。

注意

当我使用邮递员发送数据时,作为

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

插入数据并在数据库中创建新的 Foo。

至于我的方法,问题很明显,你应该在邮递员中发送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], 
               }]
})

并在 REST 控制器中进行一些更改,以这种方式将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 错误。