【问题标题】:ajax post call causes 400 (Bad Request) on sending array to spring rest controllerajax post call 导致 400 (Bad Request) 将数组发送到 Spring Rest 控制器
【发布时间】:2016-03-09 10:11:31
【问题描述】:

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

【问题讨论】:

    标签: javascript java jquery ajax spring


    【解决方案1】:

    就我的方法而言,问题很明显,您应该在 Postman 中发送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 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      • 2014-01-10
      • 1970-01-01
      • 2017-09-26
      相关资源
      最近更新 更多