使用自定义设置器的@RestController和@ModelAttribute

时间:2019-08-31 18:24:59

标签: java spring

我有我的Chat.js,他的参数已映射到@RestController中,以缩短参数列表。但是,某些属性必须转换为自定义对象(即Long-> Instant)。我的问题是有一种方法可以让spring使用我的设置器来设置那些对象吗?

控制器映射

@ModelAttribute

ModelAttribute类

@GetMapping("/v1/my/path")
public Collection<Dto> getAll(@ModelAttribute MyRequest request) {
    return someSevice.doSomething(request);
}

2 个答案:

答案 0 :(得分:1)

您始终可以对对象使用自定义反序列化

检查下一个link

public class ItemDeserializer extends StdDeserializer<Item> {

    public ItemDeserializer() {
        this(null);
    }

    public ItemDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Item deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        int id = (Integer) ((IntNode) node.get("id")).numberValue();
        String itemName = node.get("itemName").asText();
        int userId = (Integer) ((IntNode) node.get("createdBy")).numberValue();

        return new Item(id, itemName, new User(userId, null));
    }
}

答案 1 :(得分:0)

实现自己的转换器似乎是解决此问题的最佳解决方案,因为无法注释将用于填充@ModuleAttribute的设置器。

@Component
public class StringToInstantConverter implements Converter<String, Instant> {

    @Override
    public Instant convert(String epochSeconds) {
        return Instant.ofEpochSecond(Long.valueOf(epochSeconds));
    }
}