Spring MVC @PathVariable尝试使用矩阵参数

时间:2017-06-23 23:44:39

标签: java rest spring-mvc jersey

我正在将我的一个项目从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);
    }
}

如果有人有任何想法为什么第二个端点试图消耗所有东西,我肯定可以使用一些帮助。

0 个答案:

没有答案