I solved this problem.
1) I created the HttpMessageConverter, wich converts json to my custom type QuestionPostDto:
public class QuestionPostDtoHttpMessageConverter implements HttpMessageConverter<QuestionPostDto> {
@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
return QuestionPostDto.class == clazz;
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
return QuestionPostDto.class == clazz;
}
@Override
public List<MediaType> getSupportedMediaTypes() {
List<MediaType> list = new ArrayList<MediaType>();
list.add(MediaType.MULTIPART_FORM_DATA);
return list;
}
@Override
public QuestionPostDto read(Class<? extends QuestionPostDto> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
InputStream istream = inputMessage.getBody();
String requestString = IOUtils.toString(istream, "UTF-8");
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(requestString, QuestionPostDto.class);
}
@Override
public void write(QuestionPostDto t, MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
}
}
2) I create bean for this type of HttpMessageConverter (we use Spring Boot in project):
@Configuration
public class HttpConfiguration {
...
@Bean
public QuestionPostDtoHttpMessageConverter commonsMultipartResolver() {
return new QuestionPostDtoHttpMessageConverter();
}
}
3) Now my code in RestController works fine:
@RestController
@RequestMapping("/api/question")
@ConfigurationProperties(prefix = "question")
@RequiredArgsConstructor
@Slf4j
public class QuestionController {
...
@PostMapping
ResponseEntity<String> addQuestion(@RequestPart("dtoObject") QuestionPostDto dtoObject, @RequestPart("file") MultipartFile file) { ... }
Thanks to everybody, especially Chi Dov