通过spring @RequestBody将字符串时间存储在sql.Time中

时间:2016-09-16 17:25:17

标签: java json spring-mvc

我需要在后端存储时间(小时和分钟)。数据来自json中的UI,并具有以下视图" 10:00"作为expamle。在后端,我决定将这段时间保留在sql.Time类型中。到了春季上课的时间@RequestBody并且随后导致异常:org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Instantiation of [simple type, class java.sql.Time] value failed: null (through reference chain: biz.models.CarWash["firstShift"]);

如何通过@RequestBody注释将我的时间放在sql.Time字段中? 在sql.Time类型中保留时间并将其从json中的UI发送为" 10:00" ?

我的控制器:

@RequestMapping(value = "/carwash/add", method = RequestMethod.PUT, produces = "application/json;charset=UTF-8")
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Long addCarWashPUT(@RequestBody CarWash carWash) throws ParseException {
    System.out.println(carWash);
    return 999L;
}

2 个答案:

答案 0 :(得分:1)

问题在于Jackson(默认情况下在Spring MVC中使用)并不知道如何转换" 10:00" - > java.sql.Time,它并不明显。您可以定义自定义反序列化器来执行从字符串到java对象的转换:

jspm build src/App.js ./dist/index.js --minify --skip-source-maps

要使用此解串器,只需输入

即可
public final class SqlTimeDeserializer extends JsonDeserializer<java.sql.Time> {

    @Override
    public java.sql.Time deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        ObjectCodec oc = jsonParser.getCodec();
        JsonNode node = oc.readTree(jsonParser);
        String time = node.textValue();
        return // convert java.sql.Time from string
    }

....

}

在CarWash类的firstShift字段之上

答案 1 :(得分:0)

尝试更新UI以此格式发送JSON:

executed from inside of actionRequested Method
fatal error: unexpectedly found nil while unwrapping an Optional   value
2016-09-16 10:30:06.194590 Fredi[2567:551009] fatal error: unexpectedly found nil while unwrapping an Optional value  

你的控制器很好。

很容易知道需要传递什么样的JSON才能看到Spring如何格式化你的JSON(使用Jackson Mapper):

{
    "firstShift": {
        "hours": 10,
        "minutes": 0
    }
}

然后点击该控制器查看生成的JSON结构。