Spring @Controller:分离GET和POST映射

3

我正在使用注解配置的Spring MVC。 我有一个控制器类来处理HTTP GET请求:

@Controller
@RequestMapping("/form")
public class FormController {

    @RequestMapping(value = "/{table}/{identifier}/edit", method = RequestMethod.GET)
    public ModelAndView getEditView(ModelMap map, @PathVariable String table, @PathVariable Object identifier) {
        //generate the view for this record
    }

还需要一个控制器来处理该URL上的表单提交

@Controller
@RequestMapping("/form")
public class FormSaveController {

    @RequestMapping(value = "/{table}/{identifier}/edit", method = RequestMethod.POST)
    public ModelAndView saveView(WebRequest request, @PathVariable String table, @PathVariable Object identifier) {
        //save the updated values and redirect to view
    }

当我尝试启动容器时,Spring会抱怨。
Caused by: java.lang.IllegalStateException: Cannot map handler 'FormSaveController' to URL path [/form/{table}/{identifier}/edit]: There is already handler of type [class com.company.web.FormController] mapped.

这似乎表明我正在尝试的在Spring中不受支持。我尝试将生成表单的控制器与保存表单的控制器分开,因为我使用Spring的@ExceptionHandler来处理任何运行时异常,并且我希望处理用于显示视图的异常与用于保存记录的异常不同。

是否有一种不同的方式来处理我正在尝试做的事情(利用Spring的@ExceptionHandler注释来处理特定类型的请求?)

2个回答

3

您是否尝试在同一类中使用?我认为这样会起作用。如果您希望使用ExceptionHandler,则可以尝试使用HandlerExceptionResolver


2
我试图将生成表单的控制器与保存表单的控制器分离开来,这是因为我正在使用Spring的@ExceptionHandler来处理任何运行时异常,并且我希望处理用于显示视图的异常与用于保存记录的异常不同。
我想象中,您的视图模板引擎会抛出与在数据存储中保存记录时遇到的异常类型层次结构不同的异常。最简单的方法可能是将这些方法放置在同一个类中,然后通过映射视图引擎类型的异常一种方式,以及DB异常另一种方式来解决您的@ExceptionResolver问题。

我最终重新设计了异常层次结构,以使每个异常事件更加独立。我还使用了Spring的PersistenceExceptionTranslationPostProcessor将所有与数据访问相关的异常转换为DataAccessException的子异常。因此,现在我有一些用于自定义异常的@ExceptionHandler方法,以及一个用于数据访问相关异常(例如在数据库中插入/更新记录)的方法。 - BuffaloBuffalo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接