Spring @PathVariable作为年份

3
我有一个端点,它是:
api/entities/{year}

我的函数长这样:

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

但是当我尝试访问这个端点时,预料之中的是,我会得到一个错误,说它无法将字符串类型转换为年份类型。显然,我需要类似于@DateTypeFormat这样的东西,但那并不起作用。

有没有一种方法可以将传入的值格式化为年份,或者我应该重新设计我的API,不使用年份?


2
我的猜测是,当您调用API并尝试将其映射到“Year”时,它会接收一个“String”。 “Year”没有使用字符串的构造函数,因此很可能会失败。 - RoadEx
检查 @RequestBody,我认为 @PathVariable@RequestParam 不能是对象。 - sanbhat
1
你可以将它作为一个字符串接受,并在终端点被触发后尝试进行转换? - dimwittedanimal
1
我建议你看一下这篇文章: https://dev59.com/r2Qn5IYBdhLWcg3wCjb0 - Cristian Caram Peñalver
1
由于您没有具体说明,这是一个 java.time.Year 吗?Spring 现在应该支持它了,如果不支持,您应该提交一个功能请求。 - chrylis -cautiouslyoptimistic-
显示剩余6条评论
3个回答

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

}

然后在Spring上下文中注册它。


在我看来,这应该是被接受的答案。另一个答案更像是一种变通方法。 - msp

1
你可以将其作为一个String接受,并在到达终点后尝试转换吗?

1
一个简单的方法是接受一个整数,然后在需要时将其转换为年份类型。您可以注册自己的HandlerMethodArgumentResolver来为您执行转换,尽管在这种情况下看起来有点繁琐,但更加优雅。另一种可能性是将其处理为日期,这种转换是免费的:@PathVariable(name = "year") @DateTimeFormat(pattern = "yyyy") Date date,您可以稍后以您喜欢的形式提取年份值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接