春季启动:LocalDateTime控制器参数(确实耗尽)

时间:2018-11-09 07:58:31

标签: spring spring-boot jackson

我正在使用LocalDateTime控制器参数来接收日期:

@RequestMapping(
    path = EspaiDocConstants.Endpoints.FO_BOINTERFACE_REQUEST_MAPPING_AUDITS,
    method = RequestMethod.GET,
    produces = MediaType.APPLICATION_JSON_VALUE
)
public Collection<Audit> listAudits(
    @RequestParam(value = "deadline", required = false)
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
        LocalDateTime deadline) {}

但是,它遇到"No primary or default constructor”问题。

根据this workaround,为了避免这种情况,我需要添加以下代码:

@ModelAttribute
LocalDateTime initLocalDate() {
    return LocalDateTime.now();
}

然后在我的@ModelAttribute参数上添加deadline

public Collection<Audit> listAudits(
    @RequestParam(value = "deadline", required = false)
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
    @ModelAttribute
        LocalDateTime deadline) {}

现在,它没有崩溃,但是无论参数值如何,我的deadline参数值始终为LocalDateTime.now()。我正在测试此请求:

https://localhost:8080/bo/audits?deadline=2000-10-31T01:30:00.000-05:00

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用方法级别的@ModelAttribute注释,可以将方法的返回值隐式添加和绑定到每个请求方法的每个模型。因此,您不必在每个GET, POST, PUTDELETE方法中都通过model.addAttribute(“ key”,value)添加对象。

因此对于您的用例,没有必要使用@ModelAttribute注释的方法。

public Collection<Audit> listAudits(
    @RequestParam(value = "deadline", required = false)
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
    LocalDateTime deadline) { ... }

应该起作用。

但是也许有必要在请求参数客户端对冒号进行编码。