加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Spring MVC @RequestBody map可选

发布时间:2020-12-15 04:29:01 所属栏目:Java 来源:网络整理
导读:我有一个这个方法的休息控制器: @RequestMapping(value = "",method = { RequestMethod.POST },produces = { MediaType.APPLICATION_JSON_VALUE }) public ResponseEntity? add(@Valid @RequestBody MyModel myModel,Errors errors) { ... return new Respo
我有一个这个方法的休息控制器:

@RequestMapping(value = "",method = { RequestMethod.POST },produces = { MediaType.APPLICATION_JSON_VALUE })
    public ResponseEntity<?> add(@Valid @RequestBody MyModel myModel,Errors errors) {

        ...
        return new ResponseEntity<SomeObject>(someObject,HttpStatus.OK);
    }

在MyModel中有一个字段isMeetingOrSale,它是枚举(MeetingSaleFlag):

public enum MeetingSaleFlag {
    MEETING("MEETING"),SALE("SALE");
    private final String name;       
    private MeetingSaleFlag(String s) { name = s; }
    public boolean equalsName(String otherName) {
       return (otherName == null) ? false : name.equals(otherName);
    }
    public String toString() { return this.name; }
}

并且它可以映射具有字段“isMeetingOrSale”的json:“MEETING”

但是json中的值可能是“isMeetingOrSale”:“”或完全丢失,因此在这种情况下我希望将字段映射为null.如果我将字段更改为可选< MeetingSaleFlag>

我有

Could not read JSON: Can not instantiate value of type [simple type,
class java.util.Optional<MeetingSaleFlag>] from String value
(‘MEETING’); no single-String constructor/factory methodn at
[Source: java.io.PushbackInputStream@32b21158; line: 17,column: 18]
(through reference chain: MyModel[”isMeetingOrSale”]);

所以问题是如何从json映射可选枚举?

解决方法

感谢Sotirios Delimanolis的评论,我能够解决这个问题.

1)添加

<dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jdk8</artifactId>
        </dependency>

作为依赖.

2)重新配置Jackson映射器.寄存器:

@Bean
    @Primary
    public ObjectMapper jacksonObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module());
        return mapper;
    }

或者这样做以注册jdk8模块

/**
 * @return Jackson jdk8 module to be registered with every bean of type
 *         {@link ObjectMapper}
 */
@Bean
public Module jdk8JacksonModule() {
    return new Jdk8Module();
}

Another way to customize Jackson is to add beans of type com.fasterxml.jackson.databind.Module to your context. They will be registered with every bean of type ObjectMapper,providing a global mechanism for contributing custom modules when you add new features to your application.

这样做只会注册附加模块并保留Spring Boot提供的内置Jackson配置.

3)结果

现在,当发送的json中缺少该属性时,它将映射为null
(这不是那么好.我期待它会给我一个可选的,我将能够使用.isPresent()).
当它是一个空字符串(“isMeetingOrSale”:“”)时,杰克逊会返回一个错误:

Could not read JSON: Can not construct instance of
MyModel from String value ”: value not
one of declared Enum instance names: [VAL1,VAL2]

哪个看起来对我好.

有用的链接:Jackson jdk8 module,Spring MVC configure Jackson

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读