实现可重用的@Controller

时间:2014-07-17 18:39:07

标签: java spring spring-mvc

我实施some SQL-CRUD components for Spring-MVC并且我遇到了问题。

我提供了一个TableController,它提供了几种控制器方法:

public class TableController ... {

    public TableController(String tableName) { ... }

    @RequestMapping("/list")
    public ModelAndView list() { ... }

    @RequestMapping("/addForm")
    public ModelAndView addForm() { ... }
    ...

这个TableController基本上提供了数据库表的功​​能 - 一个控制器方法,列出了表的行,用于创建和更新表行的表单等。这是一个有点复杂的类,因为它需要可自定义以为不同的表提供不同的行为。

理想情况下,我希望此控制器的用户能够为他们希望在其网站中公开的每个数据库表添加一个新实例,方法是将其添加到上下文中,如下所示:

@Configuration
class Context {
    @Bean("/vets/")
    public TableController vetController() {
        return new TableController("vets");
    }

    @Bean("/pets/")
    public TableController petController() {
        return new TableController("pets");
    }

我希望在他们的应用中显示/vets/list/vets/addForm/pets/list个网址。

然而,这不起作用。我实现此功能的唯一方法是不在@RequestMapping中使用任何 TableController注释,并让每个表的应用扩展TableController我希望在子类中公开和定义所有 @RequestMapping,例如我在ApplicationPetController

中所做的事情

这有效,但它非常尴尬。有什么方法可以改善这个吗?

编辑:我似乎已经搞砸了:

  

还有一些事情不再可能:

     
      
  • 首先使用SimpleUrlHandlerMapping或BeanNameUrlHandlerMapping选择控制器,然后根据此方法缩小方法   @RequestMapping annotations。
  •   

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-31-vs-30

2 个答案:

答案 0 :(得分:2)

你需要的只是一个带有动态“@RequestMapping”的“@TableController”。使用变量,路径或请求来标识数据库表或实体并相应地构建查询。您甚至可以将其与登录用户混合以构建限制,例如。

@Controller
@RequestMapping("/{tablename}")
public class TableController ... {


    public TableController() { ... }

    @RequestMapping("/list")
    public ModelAndView list(@PathVariable("tablename") String tablename) { ... }

    @RequestMapping("/addForm")
    public ModelAndView addForm(@PathVariable("tablename") String tablename) { ... }
    ...

阅读“@RequestMapping”和“@Controller”的javadoc。它们支持很多变量类型。

答案 1 :(得分:1)

您是否尝试将@RequestMapping注释添加到子类的类级别?通过这样做,@RequestMapping中的其他TableController注释应该变为相对的。每个表仍然会有一个类,但它变得非常简单。例如:

// No @RequestMapping on class level
public abstract class TableController {
    // all methods annotated with @RequestMapping that will be relative once inherited
}

第一个实际控制器

@Controller
@RequestMapping("/vets")
public class VetController extends TableController {

    public VetController() {
        super("vets");
    }

    // other methods and relative @RequestMapping omitted since they are inherited from parent class 
}

第二个控制器

@Controller
@RequestMapping("/pets")
public class PetController extends TableController {

    public PetController() {
        super("pets");
    }

    // other methods and relative @RequestMapping omitted since they are inherited from parent class 
}

有关@RequestMapping的更多信息,请参阅Spring的reference documentation