spring 如何在Sping Boot 中正确使用Form Data参数?

0vvn1miw  于 2024-01-05  发布在  Spring
关注(0)|答案(2)|浏览(282)

我正在从Google Guice和JAX-RS迁移到Sping Boot 。以前我看起来像这样的方法:

  1. @POST
  2. @Path("/generateTable")
  3. public ExportResult generateTable(@FormParam("content") TableParam tableParam,
  4. @FormParam("panel") PanelParam panelParam,
  5. @FormParam("entityData") EntityDataParam entityDataParam,
  6. @FormParam("drillPath") TypoParam typoParam)

字符串
现在我需要在Sping Boot 中迁移此代码。我已经在Chrome DevTools上查看了到达此端点的请求,并且在有效负载中它具有表单数据参数。
在将代码重写到Sping Boot 时,我意识到我不能用@RequestParam替换@FormParam,所以我的一个解决方案是使用这个:

  1. @PostMapping("/generateTable")
  2. public ExportResult generateTable(@RequestBody MultiValueMap<String, String> formData) {


但是当使用这种方法时,我需要从formData散列表中获取参数,并手动将它们解析为相应的对象。有没有一种方法可以自动完成这一点,而无需我检查是否已传递参数以及其他参数。还有另一种方法,我在考虑是否可以创建一个包含请求中所有参数的自定义对象,并使用@ RequestBody自动解析?
任何其他方法都将有很大的帮助!

tgabmvqs

tgabmvqs1#

使用@RequestParam annotation将JAX-RS请求重写到Sping Boot MVC很简单。在您的示例中,类似于以下内容:

  1. @PostMapping(path = "/generateTable", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
  2. public ResponseEntity<ExportResult> generateTable(@RequestParam("content") TableParam tableParam,
  3. @RequestParam("panel") PanelParam panelParam,
  4. @RequestParam("entityData") EntityDataParam entityDataParam,
  5. @RequestParam("drillPath") TypoParam typoParam))

字符串
此外,您还需要提供从String到Java对象的转换器。您可以在现有类中识别必要的代码。它可以是带有单个String参数的构造函数,也可以是名为valueOf()fromString()的静态方法,或者是ParamConverterProvider的注册实现。
使用此代码并在Spring组件中实现Converter<S, T>接口。类似于下面的示例。它从JSON String构造Customer对象:

  1. import com.fasterxml.jackson.core.JsonProcessingException;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import org.springframework.core.convert.converter.Converter;
  4. @Component
  5. public class CustomerConverter implements Converter<String, Customer> {
  6. @Autowired
  7. private ObjectMapper mapper;
  8. @Override
  9. public Customer convert(String customer) {
  10. try {
  11. return mapper.readValue(customer, Customer.class);
  12. } catch (JsonProcessingException e) {
  13. throw new IllegalArgumentException(e);
  14. }
  15. }
  16. }

展开查看全部
knpiaxh1

knpiaxh12#

实际上,你可以限制内容类型,并使用对象类来接受参数。
在控制器上:

  1. @RestController
  2. @RequestMapping("/test")
  3. public class TestController {
  4. @PostMapping(value = "/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  5. public ResponseEntity<Object> generateTable(FormDataDTO data){
  6. return ResponseEntity.ok(data);
  7. }
  8. }

字符串
FormDataDTO:

  1. @Data
  2. public class FormDataDTO {
  3. private TinyDTO tiny;
  4. private TinyDTO mid;
  5. private TinyDTO height;
  6. }


TinyDTO:

  1. @Data
  2. public class TinyDTO {
  3. private String str;
  4. private Integer num;
  5. }


如何申请?你可以这样测试:

  1. ###
  2. POST http://localhost:10001/test/form-data
  3. Content-Type: multipart/form-data; boundary=boundary
  4. --boundary
  5. Content-Disposition: form-data; name="tiny.str"
  6. aaaa
  7. --boundary
  8. Content-Disposition: form-data; name="tiny.num"
  9. 1
  10. --boundary
  11. Content-Disposition: form-data; name="mid.str"
  12. mid
  13. --boundary
  14. Content-Disposition: form-data; name="mid.num"
  15. 99
  16. --boundary
  17. Content-Disposition: form-data; name="height.str"
  18. height
  19. --boundary
  20. Content-Disposition: form-data; name="height.num"
  21. -1
  22. --boundary--


回应是:

  1. {
  2. "tiny": {
  3. "str": "aaaa",
  4. "num": 1
  5. },
  6. "mid": {
  7. "str": "mid",
  8. "num": 99
  9. },
  10. "height": {
  11. "str": "height",
  12. "num": -1
  13. }
  14. }

展开查看全部

相关问题