Java Spring@PathVariable作为一年

Java Spring@PathVariable作为一年,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个端点是: api/entities/{year} 我的函数如下所示: get(@PathVariable(name = "year") Year year) 但是,当我尝试到达端点时,我预期会得到一个错误,它无法从类型String转换为类型Year。我显然需要@DateTypeFormat之类的格式,但这并不能真正起作用 有没有一种方法可以将传入值格式化为一年,或者我应该修改API以不使用一年 您可以将其作为字符串接受,并在点击端点后尝试转换?您可以执行以下操作: public cl

我有一个端点是:

api/entities/{year}
我的函数如下所示:

get(@PathVariable(name = "year") Year year)
但是,当我尝试到达端点时,我预期会得到一个错误,它无法从类型String转换为类型Year。我显然需要@DateTypeFormat之类的格式,但这并不能真正起作用


有没有一种方法可以将传入值格式化为一年,或者我应该修改API以不使用一年

您可以将其作为
字符串接受,并在点击端点后尝试转换?

您可以执行以下操作:

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);
    }

}
然后
在您的spring上下文中注册它

一个简单的方法是接受一个
整数
,如果您确实需要一个
年份
类型,则将其转换

您可以注册自己的
HandlerMethodArgumentResolver
来为您进行转换,尽管在这种情况下,它看起来像是太多的锅炉板,但它更优雅

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

@PathVariable(name=“year”)@DateTimeFormat(pattern=“yyyy”)日期日期日期


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

我的猜测是,当您调用api时,它会收到一个
字符串
,并尝试将其映射到
年份
Year
没有使用字符串的构造函数,因此它可能会失败?也许这可以帮助您:您可以将其作为
String
接受,并在端点被命中后尝试转换?我建议您看看这篇文章:既然您不明确,这是
java.time.Year
?Spring现在应该支持OOTB,如果它不支持,您应该提交一个特性请求。IMHO,这应该是可以接受的答案。另一个答案更像是一种变通方法。