Передача json в качестве тела и другого объекта в качестве параметра контроллеру Spring

Я возвращаю список объектов в виде json моему контроллеру spring, но мне также нужно передать ему некоторые данные о клиенте, такие как имя, фамилия, адрес, тип оплаты, поэтому я подумал, что создаю для этого POJO и передаю это как параметр запроса, но не повезло.

Весенний контроллер:

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

Pojo - это AddDetails, в котором есть геттер/сеттер и т. д., использующий ломбок. Я пытаюсь передать в своем 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. Можно ли по-другому?

Большое спасибо

*** ОБНОВИТЬ ***

Отсортировав это сейчас, я в основном создал еще одно pojo для сведений о клиенте, которое добавляется к стандартному объекту 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";
    }

person Steve Green    schedule 15.02.2021    source источник


Ответы (1)


Есть несколько способов сделать это. Первый вариант — удалить аннотацию @RequestParam, и 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
person Santiago Wagner    schedule 15.02.2021