Ответ 1
Самый простой способ для понимания - @ModelAttribute
взять строку запроса. поэтому все данные передаются серверу через URL-адрес.
Что касается @RequestBody
, все данные будут переданы серверу через полный корпус JSON.
Пожалуйста, поправьте меня, если я ошибаюсь. Оба могут использоваться для привязки данных.
Вопрос в том, когда следует использовать @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){ }
В соответствии с моим пониманием обе служат аналогичной цели.
Спасибо!!
Самый простой способ для понимания - @ModelAttribute
взять строку запроса. поэтому все данные передаются серверу через URL-адрес.
Что касается @RequestBody
, все данные будут переданы серверу через полный корпус JSON.
@ModelAttribute, используемый для привязки данных из параметра запроса (в парах значений ключа),
но @RequestBody используется для привязки данных из тела дыр запроса типа POST, PUT.., который содержит другой формат, например json, xml.
Я нахожу, что @RequestBody (также аннотирующий класс как @RestController) лучше для запросов AJAX, где у вас есть полный контроль над содержимым выдаваемого запроса, и содержимое отправляется как XML или JSON (из-за Джексона), Это позволяет содержимому легко создавать объект модели. И наоборот, @ModelAttribute, похоже, лучше подходит для форм, где есть "командный" объект, поддерживающий форму (которая необязательно может быть модельным объектом).
Вы можете напрямую получить доступ к своему "домашнему" объекту в уровне просмотра, если вы используете аннотацию ModelAttribute. Кроме того, вы можете создать экземпляр этого объекта в методе на вашем контроллере, чтобы разместить свою модель. см. это.
ModelAttribute дает вам возможность частично использовать этот объект, но с помощью RequestBody вы получаете весь запрос.
Я думаю, что @ModelAttribute и @RequestBody имеют одинаковое использование, единственное различие заключается в использовании @ModelAttribute для обычного пружинного MVC и @RequestBody для веб-службы REST. Это @PathVariable и @PathParam. Но в обоих случаях мы можем смешать это. мы можем использовать @PathVariable в REST и наоборот.
Если вы хотите сделать загрузку файла, вы должны использовать @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;
}