【问题标题】:How to convert a @RequestParam Map<String, String> to a custom a Map<>如何将 @RequestParam Map<String, String> 转换为自定义的 Map<>
【发布时间】:2019-12-22 12:16:55
【问题描述】:

我正在尝试将@RequestParam Map&lt;String, String&gt; 转换为我自己的Map&lt;Enum, Long&gt;,我想知道该怎么做。我的服务需要得到这个转换后的Map&lt;Enum, Long&gt;,我真的很想避免一个封装我的枚举和 id 的对象。

这是必要的,因为端点是用api/suff?FOO=1234&amp;BAR=4567 调用的,并且此服务只有一个是必需的。

我已经尝试使用Converter&lt;String, Map&lt;Enum, Long&gt;&gt; 创建自己的org.springframework.core.convert.converter.Converter。但我无法转换它。

目前我的端点是这样的:

@GetMapping
public ResponseEntity<Stuff> getByIds(@RequestParam @NotEmpty @Size(max = 2) Map<Enum, Long> map) {
    return new ResponseEntity<>(someService.getStuff(map), HttpStatus.OK);
}

有没有办法为这种情况实现自定义转换器,还是我必须遵循其他方法?

【问题讨论】:

    标签: java spring spring-boot spring-mvc converters


    【解决方案1】:

    我会投票支持实现这一目标的替代方法 -

    @GetMapping
    public ResponseEntity<Stuff> getByIds(@RequestParam(value="FOO", required = false) 
        String fooValue, @RequestParam(value="BAR", required = false) String barValue) {
    
        //Assuming you already have an ExceptionAdvice/handler for issues with the values passed
        Map<Enum, Long> map = new HashMap<Enum, Long>();
        if(null != fooValue){
            map.put("FOO", Enum.parse(fooValue));
        }
        if(null != barValue){
            map.put("BAR", Long.valueOf(barValue));
        }
        return new ResponseEntity<>(someService.getStuff(map), HttpStatus.OK);
    }
    

    我不确定这是否会过度简化您的 API - 这是我所期望的判断调用。

    【讨论】:

    • 感谢您的回复和非常准确的解决方案。与此同时,我想出了另一个。我创建了一个StaffMap,它扩展了HashMap&lt;Enum, Long&gt;。在构造函数中,我们传递Map&lt;String, String&gt; 并将其映射到map.forEach((key, value) -&gt; put(Enum.valueOf(key), Long.parseLong(value)); 这当然是设计决定,因为如果映射不成功并且只有一个字段是必需的,我们想抛出异常。
    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 2013-05-24
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多