将json作为主体和另一个对象作为参数传递给spring控制器

nnsrf1az  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(235)

我正在将一个对象列表作为json传回我的spring控制器,但是我还需要向它传递一些客户的详细信息,比如名字、姓氏、地址、付款类型——所以我想我为此创建了一个pojo,并将其作为请求参数传递,但运气不好。
Spring控制器:

@RequestMapping(value = "/addstock", method = RequestMethod.POST)
    public @ResponseBody
    String addPersons(@RequestBody StockList stock, @RequestParam(name="details") AddDetails details) throws ParseException, IOException

pojo是adddetails,它使用lombok具有getter/setter等。我尝试在javascript中传递以下内容:

function sendData() {
            var stocks = JSON.stringify({'stocks': model.stock()});
            var obj = { "firstname":"Steve", "lastname":"Green"};
            obj = JSON.stringify({'details':obj});
            $.ajax({
                url:"/addstock?details="+obj,
                type: 'POST',
                data:  stocks,
                dataType: "html",
                contentType: 'application/json',
                mimeType: 'application/json',
                success: function(data){
                    console.log(data);
                    return false;
                }
            });
        }

但显然我不能把一个对象传递给details param。有没有别的办法?
非常感谢

更新

现在,我基本上为客户详细信息创建了另一个pojo,添加到stock json对象中:
例子:

function sendData() {
            var adddetails = {firstname:"steve",lastname: "jack",add1:"6 redby lane",add2:"brixon",add3:"",city:"manchester",postcode:"b3434",tel:"0090909090"};
            var stocks = JSON.stringify({'details':adddetails,'stocks': model.stock()});
            $.ajax({
                url:"/addstock",
                type: 'POST',
                data:  stocks,
                dataType: "html",
                contentType: 'application/json',
                mimeType: 'application/json',
                success: function(data){
                    console.log(data);
                    return false;
                }
            });
            return false;
        }

@Getter
@Setter
public class AddDetails {
    private String firstname, lastname,add1,add2,add3,postcode,tel;
}

@Getter
@Setter
public class StockList {
    AddDetails details;
    List<Stock> stocks;
}

  @RequestMapping(value = "/addstock", method = RequestMethod.POST)
    public @ResponseBody
    String addPersons(@RequestBody StockList stock) throws ParseException, IOException {
        try {

            // perform add operation
            stock.getStocks().forEach(s->System.out.println(s));
            return "Successfully added stock.";
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return "Error";
    }
xwbd5t1u

xwbd5t1u1#

有几种方法可以做到这一点。第一种选择是移除 @RequestParam annotation和spring将自动将查询字符串中的参数绑定到pojo。但是,在您的代码中,您将json表示附加到url,这是不可能的。这是您应该用于adddetails字段的正确语法:

/addstock?firstname=value1&lastname=value2

另一种可能的解决方案是定义一个dto,其中包含股票列表和adddetails对象,并将其作为请求主体传递。例如:

public class StockListDTO{

    List<Stock> stocks;

    AddDetails details;

    //Getter and setters or use Lombok

}

以及您的方法签名:

@RequestMapping(value = "/addstock", method = RequestMethod.POST)
    public @ResponseBody
    String addPersons(@RequestBody StockListDTO body) throws ParseException, IOException

相关问题