java – Spring MVC @RequestBody map可选
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Spring MVC @RequestBody map可选,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2526字,纯文字阅读大概需要4分钟。
内容图文
我有一个这个方法的休息控制器:
@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,
classjava.util.Optional<MeetingSaleFlag>
] from String value
(‘MEETING’); no single-String constructor/factory method\\n 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
内容总结
以上是互联网集市为您收集整理的java – Spring MVC @RequestBody map可选全部内容,希望文章能够帮你解决java – Spring MVC @RequestBody map可选所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。