Карта как параметр в RestAPI Post request - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть созданный API с параметром Map

@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);
}

Я пытаюсь вызвать это через Почтальона

Снимок экрана Почтальона

Я передал fileColumnHeaders в Body-> Form Data, как в SS

Затем я получил сообщение, подобное этому, в почтальоне

Не удалось преобразовать значение типа 'java.lang.String 'для требуемого типа' java.util.Map ';Вложенное исключение: java.lang.IllegalStateException: невозможно преобразовать значение типа «java.lang.String» в требуемый тип «java.util.Map»: не найдено подходящих редакторов или стратегии преобразования.

Кто-нибудьзнаете почему пришло это сообщение?Как мы можем передать карту в качестве параметра в запросе Rest API?Как мы можем передать карту через почтальона?

Любая помощь поможет

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

... Или просто создайте конвертер:

@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;
    }
  }

}
0 голосов
/ 07 февраля 2019

Я думаю, это может сработать:

@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);
}

Поместите все остальные параметры в тело, но добавьте fileColumnHeaders к URL-адресу следующим образом:

/upload/firstName=1;lastName=2;address=3;phone=4

Вам также понадобится эта дополнительная конфигурация:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setRemoveSemicolonContent(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
}
0 голосов
/ 07 февраля 2019

Во-первых, вы создаете объект DTO для получения всех данных из вашего запроса.

public class FormDataDTO {

    private MultipartFile file;

    private String name;

    private Long campaignAppItemId;

    private Map<String,Integer> fileColumnHeaders;

    // getters, setters
}

Во-вторых, вы можете отобразить FormDataDTO из вашего запроса без каких-либо аннотаций:

@RequestMapping(value = "upload", method = RequestMethod.POST)
public ResponseEntity<String> handleContactsFileUpload(FormDataDTO formDataDTO){
    // your logic code here
}

Наконец,Форма данных в вашем запросе будет: enter image description here

0 голосов
/ 07 февраля 2019

Вы можете использовать @RequestBody вместо @RequestParam для Карт и других нетривиальных типов данных и объектов - таким образом Spring будет отображать JSON, представляющий ваш параметр карты, в объект домена, который затем сериализуется и может быть преобразован вобъект Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...