我正在将我的一个项目从Jersey迁移到Spring MVC,而且我遇到了两个资源问题,它几乎完全相同;只有一个用于获取属于登录用户的客户的统计信息,而另一个用于使用客户ID执行相同的操作。
这就是泽西岛最初的资源:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Secured({Role.USER})
public List<Stat> getUserStats(@Context User user,
@MatrixParam("from") String from,
@MatrixParam("to") String to) {
return statService.getStats(user, from, to);
}
@GET
@Path("/{cid}")
@Produces(MediaType.APPLICATION_JSON)
@Secured({Role.ADMIN})
public List<Stat> getCustomerStats(@PathParam("cid") Long cid,
@MatrixParam("from") String from,
@MatrixParam("to") String to) {
return statService.getStats(cid, from, to);
}
@Secured
是一个自定义注释,用于应用ContainerRequestFilter
来验证和授权用户并注入第一个资源中使用的用户对象。我通过扩展GenericFilterBean
在Spring MVC中做了几乎相同的事情,这使我能够将用户对象作为@ModelAttribute
传递给我的每个端点。我不确定这是否是解决此问题的最佳方法,但现在它的效果还不错。
我的问题是,我已尝试在Spring MVC中实现这些相同的功能,但所有请求总是最终由这两个中的第二个解决:
@GetMapping(produces = "application/json")
public List<Stat> getUserStats(@MatrixVariable String from,
@MatrixVariable String to) {
return statService.getStats(null, from, to);
}
@GetMapping(path = "/{cid}", produces = "application/json")
public List<Stat> getCustomerStats(@PathVariable Long cid,
@MatrixVariable String from,
@MatrixVariable String to) {
return statService.getStats(cid, from, to);
}
(我现在已将@ModelAttribute
排除在等式之外,以免不必要地复杂化。)
我试图用
调用这些资源 http://localhost:8080/stats/from=2017-05-01;to=2017-05-31
用户和
http://localhost:8080/stats/12345;from=2017-05-01;to=2017-05-31
为管理员。
后者始终有效,但第一个会导致MethodArgumentTypeMismatchException
,并显示以下消息:
Failed to convert value of type 'java.lang.String' to required type
'java.lang.Long'; nested exception is java.lang.NumberFormatException:
For input string: \"from=2017-05-01;to=2017-05-31\"
我原本无法获得矩阵参数,但是一些谷歌搜索引导我实现以下配置:
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setRemoveSemicolonContent(false);
urlPathHelper.setAlwaysUseFullPath(true);
configurer.setUrlPathHelper(urlPathHelper);
}
}
如果有人有任何想法为什么第二个端点试图消耗所有东西,我肯定可以使用一些帮助。