Spring boot как настроить десериализацию - PullRequest
0 голосов
/ 26 июня 2018

Есть множество тем на эту тему, но, похоже, ни одна из них не помогает в том, что я пытаюсь сделать. У меня есть полезные нагрузки JSON API Spec'ed String, входящие в Controllers, но я бы хотел перехватить входящую полезную нагрузку и десериализовать ее по своему усмотрению.

Итак, код для объяснения:

@PostMapping("/steaks")
public ResponseEntity<String> create(@RequestBody String payload) {
    // JsonTransformService is a custom service which converts the JSON API Spec string into a Steak POJO
    final Steak steak = jsonTransformService.read(Steak.class, payload);

    // [...] logic to do with a Steak
}

Я бы хотел иметь

@PostMapping("/steaks")
public ResponseEntity<String> create(@RequestBody Steak steak) {
    // [...] logic to do with a Steak
}

Однако на данный момент я не могу этого сделать, потому что полезная нагрузка не подходит для десериализации.

Итак, я попытался расширить MappingJackson2HttpMessageConverter и переопределить метод read, но это не сработало, потому что использование inputMessage закрывает поток.

Какой правильный способ справиться с этим?

Редактировать

Попытка использовать конвертер в соответствии с предложением, но он игнорируется Controller

@Slf4j
@Component
public class SteakConverter implements Converter<String, Steak> {

    private final JsonTransformService jsonTransformService;

    public SteakConverter(JsonTransformService jsonTransformService) {
        this.jsonTransformService = jsonTransformService;
    }

    @Override
    public Steak convert(String value) throws IOException {
        log.info("converting {}", value);

        return jsonTransformService.read(Steak.class, value);
    }
}

И поправил Controller

public ResponseEntity<String> create(@RequestBody Steak steak) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...