在Spring mvc 3.1中添加自定义RequestCondition

ori*_*ori 5 spring spring-mvc

我有一个Spring mvc(3.1.1)应用程序,我想定义条件超出RequestMapping中可用的条件.我有几件事我想用它.

首先,如果我可以为不同的用户类型显示不同的主页,那将是很好的:

@Controller
public class HomepageController {

    @RequestMapping(value = "/")
    @CustomCondition(roles = Guest.class)
    public String guestHome() { /*...*/ }

    @RequestMapping(value = "/")
    @CustomCondition(roles = Admin.class)
    public String adminHome() { /*...*/ }

}
Run Code Online (Sandbox Code Playgroud)

其次,我希望应用程序既可以作为网站也可以作为REST服务(例如移动应用程序),所以我想让网站访问html和json操作,并让服务(不同的子域)访问json动作(某种@CustomCondition(web = true)只与网站网址匹配)

这可以用于我正在计划的两种用途中的任何一种吗?

我发现很少有关于自定义条件的文档,但我确实找到了一个实现自定义条件的示例,这可能是我想要的,但它使用的是一个@Configuration类,而不是我正在使用的XML配置,我不想移动我的整个spring xml定义到一个@Configuration类.

我可以RequestMappingHandlerMapping在XML中定义customMethodCondition 吗?

我尝试了子类化RequestMappingHandlerMapping和覆盖getCustomMethodCondition,以返回我的自定义RequestCondition,但它没有工作 - getMatchingCondition()在我的条件下没有开火.

任何帮助将不胜感激!

UPDATE

我读了一点,看起来像是RequestMappingHandlerMapping一个新类(从3.1开始).

在我的应用程序中发生的是,尝试覆盖从而重新定义requestMappingHandlerMappingbean 的@Configuration 实际上有效,但是url映射(s中的@RequestMapping方法@Controller)似乎被处理两次,一次由子类处理,一次由ExtendedRequestMappingHandlerMapping原始处理 - 第RequestMappingHandlerMapping一次处理自定义条件,然后再没有它.

底线是我的自定义条件被简单地忽略.

这应该是一种先进的模式,但IMO应该很常见......

评论任何人?

hyn*_*ess 3

Spring MVC 已经提供了一种区分 json 和 html 的机制,RequestMapping 注释采用一个 Consumer 属性来查看请求的内容类型...

// REST version, Content-type is "application/json"
@RequestMapping(value = "/", consumes = "application/json")
public void myRestService() {
...

// HTML version, Content-type is not "application/json"
@RequestMapping(value = "/", consumes = "!application/json")
public void myHtmlService() {
...
Run Code Online (Sandbox Code Playgroud)

使用相同 url 但具有不同方法的另一种方法是使用 param 或 headers 属性...

// the url is /?role=guest
@RequestMapping(value = "/", param = "role=guest")
public void guestService() {

// the url is / with header role=admin
@RequestMapping(value = "/", headers = "role=admin")
public void adminService() {
Run Code Online (Sandbox Code Playgroud)

我认为您会需要不同的网址以确保安全。通常,使用 Spring Security 之类的东西,您可以将所有管理功能放在 /admin 下,并让框架管理这一切......

<http auto-config="true">
  <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
...
Run Code Online (Sandbox Code Playgroud)

这足以满足您的用例吗?