Как передать аргумент пользовательскому десериализатору JSON в приложении весенней загрузки - PullRequest
1 голос
/ 18 июня 2019

Я хочу использовать свой собственный десериализатор в контроллере отдыха с весенней загрузкой.Чтобы выполнить свою работу, ему нужна некоторая настраиваемая конфигурация, которая предоставляется ему в качестве аргумента конструктора.Как я могу передать такой аргумент в контроллер покоя?

Вот пример.

DTO (с некоторыми аннотациями lombok):

@Getter
@Setter
@RequiredArgsConstructor
@AllArgsConstructor
@JsonDeserialize(using = Deserializer.class)
public class DTO {
    private int a;
    private int b;
}

Десериализатор:

public class Deserializer extends JsonDeserializer<DTO> {
    //custom config
    int val;

    public Deserializer(int value) {
        val = value;
    }

    @Override
    public DTO deserialize(JsonParser p, DeserializationContext ctxt) throws IOException{

        JsonNode node = p.readValueAsTree();
        int a = node.has("a") ? node.get("a").asInt() : -1;
        int b = node.has("b") ? node.get("b").asInt() : -1;
        //custom config usage
        return new DTO(a + val, b + val);
    }
}

Контроллер:


@RestController
@RequestMapping
public class Controller {
   //how to pass `val` into deserializer of DTO object?
    @PostMapping("/foo")
    DTO foo(@RequestBody DTO dto) {
        return dto;
    }
}

Любая помощь будет оценена.

1 Ответ

1 голос
/ 18 июня 2019

Вы можете создать пользовательский ObjectMapper и добавить свой собственный сериализатор к нему и в то же время загрузить пользовательское значение из application.properties.

Я думаю, что это должно работать, я написал это с верха моегоруководитель.

@Configuration
public class JacksonConfiguration {

    @Value("${customValue}")
    private int myCustomValue;

    @Bean
    public ObjectMapper objectMapper() {
        final ObjectMapper mapper = new ObjectMapper();

        final SimpleModule module = new SimpleModule();

        module.addSerializer(new Deserializer(myCustomValue));
        mapper.registerModule(module);

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