Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在RestAPI Post请求中映射为参数_Java_Spring_Spring Boot_Spring Mvc_Postman - Fatal编程技术网

Java 在RestAPI Post请求中映射为参数

Java 在RestAPI Post请求中映射为参数,java,spring,spring-boot,spring-mvc,postman,Java,Spring,Spring Boot,Spring Mvc,Postman,我创建了一个带有Map参数的API,如下所示: @RequestMapping(value = "upload", method = RequestMethod.POST) public ResponseEntity<String> handleContactsFileUpload(@RequestParam("file") MultipartFile file,

我创建了一个带有
Map
参数的API,如下所示:

@RequestMapping(value = "upload", method = RequestMethod.POST)
public ResponseEntity<String> handleContactsFileUpload(@RequestParam("file") MultipartFile file,
                                                       @RequestParam("name") String name,
                                                       @RequestParam("campaignAppItemId") Long campaignAppItemId,
                                                       @RequestParam("fileColumnHeaders") Map<String,Integer> fileColumnHeaders) throws Exception {
    if (file == null)
        return new ResponseEntity<>("No file uploaded", HttpStatus.BAD_REQUEST);
    contactService.handleContactsFile(file, name, campaignAppItemId,fileColumnHeaders);
    return new ResponseEntity<>("File uploaded successfully", HttpStatus.OK);
}
@RequestMapping(value=“upload”,method=RequestMethod.POST)
公共响应handleContactsFileUpload(@RequestParam(“文件”)多部分文件,
@RequestParam(“名称”)字符串名称,
@RequestParam(“活动AppItemId”)长的活动AppItemId,
@RequestParam(“fileColumnHeaders”)映射fileColumnHeaders)引发异常{
if(file==null)
返回新的响应属性(“未上载文件”,HttpStatus.BAD_请求);
contactService.handleContactsFile(文件、名称、活动AppItemId、文件列标题);
返回新的响应属性(“文件上传成功”,HttpStatus.OK);
}
我正试着通过邮递员给这个打电话:

我传递了
fileColumnHeaders
insidebody->表单数据,如屏幕截图所示

然后我在《邮递员》中收到了这样一条信息:

未能将“java.lang.String”类型的值转换为所需的类型“java.util.Map”;嵌套异常为java.lang.IllegalStateException:无法将类型为“java.lang.String”的值转换为所需的类型“java.util.Map”:未找到匹配的编辑器或转换策略

有人知道为什么会有这个消息吗? 我们如何在RESTAPI请求中将映射作为参数传递?
我们如何通过Postman传递映射?

对于映射和其他非平凡的数据类型和对象,您可以使用
@RequestBody
而不是
@RequestParam
——这样spring将表示映射参数的JSON映射到域对象,该域对象随后可序列化并可转换为java对象

您可以使用
@RequestBody
而不是
@RequestParam
来处理映射和其他非平凡的数据类型和对象-这样spring将表示映射参数的JSON映射到一个域对象,该域对象随后可序列化并可转换为java对象

我认为这可以奏效:

@RequestMapping(value = "upload/{fileColumnHeaders}", method = RequestMethod.POST)
public ResponseEntity<String> handleContactsFileUpload(@RequestParam("file") MultipartFile file,
                                                       @RequestParam("name") String name,
                                                       @RequestParam("campaignAppItemId") Long campaignAppItemId,
                                                       @MatrixVariable Map<String,Integer> fileColumnHeaders) throws Exception {
    if (file == null)
        return new ResponseEntity<>("No file uploaded", HttpStatus.BAD_REQUEST);
    contactService.handleContactsFile(file, name, campaignAppItemId,fileColumnHeaders);
    return new ResponseEntity<>("File uploaded successfully", HttpStatus.OK);
}

我认为这是可行的:

@RequestMapping(value = "upload/{fileColumnHeaders}", method = RequestMethod.POST)
public ResponseEntity<String> handleContactsFileUpload(@RequestParam("file") MultipartFile file,
                                                       @RequestParam("name") String name,
                                                       @RequestParam("campaignAppItemId") Long campaignAppItemId,
                                                       @MatrixVariable Map<String,Integer> fileColumnHeaders) throws Exception {
    if (file == null)
        return new ResponseEntity<>("No file uploaded", HttpStatus.BAD_REQUEST);
    contactService.handleContactsFile(file, name, campaignAppItemId,fileColumnHeaders);
    return new ResponseEntity<>("File uploaded successfully", HttpStatus.OK);
}

首先,创建DTO对象以从请求中获取所有数据

public class FormDataDTO {

    private MultipartFile file;

    private String name;

    private Long campaignAppItemId;

    private Map<String,Integer> fileColumnHeaders;

    // getters, setters
}
公共类FormDataDTO{
私有多部分文件;
私有字符串名称;
私有长活动appitemid;
私有映射文件头;
//能手,二传手
}
其次,您可以将FormDataDTO映射到您的请求,而无需任何注释:

@RequestMapping(value = "upload", method = RequestMethod.POST)
public ResponseEntity<String> handleContactsFileUpload(FormDataDTO formDataDTO){
    // your logic code here
}
@RequestMapping(value=“upload”,method=RequestMethod.POST)
公共响应手册联系人文件上载(FormDataDTO到FormDataDTO){
//你的逻辑代码在这里
}
最后,您请求中的表单数据将是:

首先,创建DTO对象以从请求中获取所有数据

public class FormDataDTO {

    private MultipartFile file;

    private String name;

    private Long campaignAppItemId;

    private Map<String,Integer> fileColumnHeaders;

    // getters, setters
}
公共类FormDataDTO{
私有多部分文件;
私有字符串名称;
私有长活动appitemid;
私有映射文件头;
//能手,二传手
}
其次,您可以将FormDataDTO映射到您的请求,而无需任何注释:

@RequestMapping(value = "upload", method = RequestMethod.POST)
public ResponseEntity<String> handleContactsFileUpload(FormDataDTO formDataDTO){
    // your logic code here
}
@RequestMapping(value=“upload”,method=RequestMethod.POST)
公共响应手册联系人文件上载(FormDataDTO到FormDataDTO){
//你的逻辑代码在这里
}
最后,您请求中的表单数据将是:
。。。或者简单地创建一个转换器:

@Component
@RequiredArgsConstructor
public class StringToMapConverter implements Converter<String, Map<String, Object>> {

  private final ObjectMapper objectMapper;

  @Override
  public Map<String, Object> convert(String source) {
    try {
      return objectMapper.readValue(source, new TypeReference<Map<String, String>>() {
      });
    } catch (final IOException e) {
      return null;
    }
  }

}
@组件
@所需参数构造函数
公共类StringToMapConverter实现转换器{
私有最终ObjectMapper ObjectMapper;
@凌驾
公共映射转换(字符串源){
试一试{
返回objectMapper.readValue(源,新类型引用(){
});
}捕获(最终IOE例外){
返回null;
}
}
}

。。。或者简单地创建一个转换器:

@Component
@RequiredArgsConstructor
public class StringToMapConverter implements Converter<String, Map<String, Object>> {

  private final ObjectMapper objectMapper;

  @Override
  public Map<String, Object> convert(String source) {
    try {
      return objectMapper.readValue(source, new TypeReference<Map<String, String>>() {
      });
    } catch (final IOException e) {
      return null;
    }
  }

}
@组件
@所需参数构造函数
公共类StringToMapConverter实现转换器{
私有最终ObjectMapper ObjectMapper;
@凌驾
公共映射转换(字符串源){
试一试{
返回objectMapper.readValue(源,新类型引用(){
});
}捕获(最终IOE例外){
返回null;
}
}
}

你发布了什么?你能提供一个例子吗?可能是我附上的邮递员截图的副本。请检查一下,这是一个帖子call@anaskodur当涉及到
@RequestParam
时,这与GET有何不同?敢看?你贴了什么?你能提供一个例子吗?可能是我附上的邮递员截图的副本。请检查一下,这是一个帖子call@anaskodur当涉及到
@RequestParam
时,这与GET有何不同?敢看吗?我们可以在请求中同时使用RequestBody和RequestParam吗?如果是这样的话,我们如何通过邮递员传递这些信息?从你的截图判断,你已经在请求正文中传递了你的地图。但是当我为地图提供RequestBody时,我在邮递员的“内容类型”多部分/表单数据中得到了这样一条消息;边界=------------------------------------818989541995583398579446;charset=UTF-8“不受支持”我们可以在请求中同时使用RequestBody和RequestParam吗?如果是这样的话,我们如何通过邮递员传递这些信息?从你的截图判断,你已经在请求正文中传递了你的地图。但是当我为地图提供RequestBody时,我在邮递员的“内容类型”多部分/表单数据中得到了这样一条消息;边界=------------------------------------818989541995583398579446;字符集=UTF-8“不受支持”