Spring @PathVariable作为一年

时间:2018-04-16 14:03:46

标签: java spring spring-boot

我的端点是:

api/entities/{year}

我的功能如下:

get(@PathVariable(name = "year") Year year)

但是当我尝试命中端点时,我希望得到一个错误,它无法从类型String转换为类型Year。我显然需要像@DateTypeFormat这样的东西,但这并不是真的有用。

有没有办法将传入的值格式化为Year,或者我应该将我的API重新编写为不使用Year?

3 个答案:

答案 0 :(得分:7)

您可以执行以下操作:

public class YearHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.getParameterType().equals(Year.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter,
                                  ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest,
                                  WebDataBinderFactory webDataBinderFactory) throws Exception {
        final String yearFromPath = nativeWebRequest.xxx();

        return Year.from(yearFromPath);
    }

}

,然后 在春天语境中注册

答案 1 :(得分:1)

你可以接受它作为String并在端点被击中后尝试转换吗?

答案 2 :(得分:1)

一种简单的方法是接受Integer,然后在真正需要Year类型时进行转换。

您可以注册自己的HandlerMethodArgumentResolver为您进行转换,虽然在这种情况下看起来太多锅炉板更优雅了。

另一种可能性是将其作为日期处理,转换是免费的:

@PathVariable(name = "year") @DateTimeFormat(pattern = "yyyy") Date date

您可以稍后以您喜欢的形式提取年份值。