Подтвердить что ты не робот

Spring: @ModelAttribute VS @RequestBody

Пожалуйста, поправьте меня, если я ошибаюсь. Оба могут использоваться для привязки данных.

Вопрос в том, когда следует использовать @ModelAttribute?

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Pet pet) { }

Кроме того, когда использовать @RequestBody?

@RequestMapping(value = "/user/savecontact", method = RequestMethod.POST
public String saveContact(@RequestBody Contact contact){ }

В соответствии с моим пониманием обе служат аналогичной цели.

Спасибо!!

4b9b3361

Ответ 1

Самый простой способ для понимания - @ModelAttribute взять строку запроса. поэтому все данные передаются серверу через URL-адрес.

Что касается @RequestBody, все данные будут переданы серверу через полный корпус JSON.

Ответ 2

@ModelAttribute, используемый для привязки данных из параметра запроса (в парах значений ключа),

но @RequestBody используется для привязки данных из тела дыр запроса типа POST, PUT.., который содержит другой формат, например json, xml.

Ответ 3

Я нахожу, что @RequestBody (также аннотирующий класс как @RestController) лучше для запросов AJAX, где у вас есть полный контроль над содержимым выдаваемого запроса, и содержимое отправляется как XML или JSON (из-за Джексона), Это позволяет содержимому легко создавать объект модели. И наоборот, @ModelAttribute, похоже, лучше подходит для форм, где есть "командный" объект, поддерживающий форму (которая необязательно может быть модельным объектом).

Ответ 4

Вы можете напрямую получить доступ к своему "домашнему" объекту в уровне просмотра, если вы используете аннотацию ModelAttribute. Кроме того, вы можете создать экземпляр этого объекта в методе на вашем контроллере, чтобы разместить свою модель. см. это.

ModelAttribute дает вам возможность частично использовать этот объект, но с помощью RequestBody вы получаете весь запрос.

Ответ 5

Я думаю, что @ModelAttribute и @RequestBody имеют одинаковое использование, единственное различие заключается в использовании @ModelAttribute для обычного пружинного MVC и @RequestBody для веб-службы REST. Это @PathVariable и @PathParam. Но в обоих случаях мы можем смешать это. мы можем использовать @PathVariable в REST и наоборот.

Ответ 6

Если вы хотите сделать загрузку файла, вы должны использовать @ModelAttribute. С @RequestBody это невозможно. Образец кода

@RestController
@RequestMapping(ProductController.BASE_URL)
public class ProductController {

    public static final String BASE_URL = "/api/v1/products";

    private ProductService productService;

    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public ProductDTO createProduct(@Valid @ModelAttribute ProductInput productInput) {
        return productService.createProduct(productInput);
    }

}

Класс ProductInput

@Data
public class ProductInput {

    @NotEmpty(message = "Please provide a name")
    @Size(min = 2, max = 250, message = "Product name should be minimum 2 character and maximum 250 character")
    private String name;

    @NotEmpty(message = "Please provide a product description")
    @Size(min = 2, max = 5000, message = "Product description should be minimum 2 character and maximum 5000 character")
    private String details;

    @Min(value = 0, message = "Price should not be negative")
    private float price;

    @Size(min = 1, max = 10, message = "Product should have minimum 1 image and maximum 10 images")
    private Set<MultipartFile> images;
}