Spring:解析url以获取过滤器

时间:2014-04-11 16:26:55

标签: java spring spring-mvc

使用Spring有一种方法可以使用这样的代码:

@RequestMapping("/animals/view/*")
public ModelAndView view(@SomeKindOfAnnotation AnimalFilter filter) {
    return new ModelAndView("myViewPage", "animals", animalService.filterBy(filter));
}

我想要这样的通话网址:

  • <myContextPath>/animals/view/(提取所有动物)
  • <myContextPath>/animals/view/type/cat(仅提取猫)
  • <myContextPath>/animals/view/type/cat/color/yellow(仅提取棕色猫)
  • <myContextPath>/animals/view/type/insect/legs/6(仅提取6条腿的昆虫)

并且对象animalFilter已经填充了包含在URL中的数据。

AnimalFilter是一个简单的POJO类,其中包含用于过滤器动物的每种类型字段的getter和setter。

如果没有办法,可以创建新的注释@SomeKindOfAnnotation以自动填充AnimalFilter吗?

1 个答案:

答案 0 :(得分:1)

你可以做的是构建一个PropertyEditor,或者你可以使用像Jackson这样的对象映射器,如果你使用的是json值,但如果你真的想使用注释,你可以使用AOP:

使用AOP的例子:

@Before(value="@annotation(audit) && args(.......)")
public void beforeHandler(SomeKindOfAnnotation audit, .......) {

使用PropertiesEditor的示例:

public class SomeKindOfPropertie extends PropertiesEditor {

@Override
public void setAsText(String text) throws IllegalArgumentException {
    // Reminding all parameters in the request are String.
            .......
            setValue(new SomeKind(text));
} 

}

在您的控制器中,您需要在活页夹上注册propertiesEditor:

@InitBinder("filter")
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(SomeKind.class, new SomeKindOfPropertie());
}

更多信息: http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/validation.html