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“不受支持”