【问题标题】:Spring common method between @RequestMappings@RequestMappings之间的Spring常用方法
【发布时间】:2018-06-05 08:08:36
【问题描述】:

Servlet 中,您可以包含在doGetdoPost 之前调用的@Override service 方法,有没有办法在Spring @Controller 中实现相同的功能?

或者更准确地说,在控制器中的每个方法中,我需要确保实体(在本例中为产品)存在并在其他情况下重定向,就像这样,那么如何在 Spring 中实现呢?请注意,我还需要每个方法中可用的产品。

@Controller
@RequestMapping("/product/{prod_id}/attribute")
public class AttributeController {

    @Autowired
    private AttributeService attributeService;

    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String add(Model model, @PathVariable Long prod_id) {
        Product product = attributeService.getProduct(prod_id);
        if (product == null) {
            return "products/products";
        }
        model.addAttribute("product", product);
        model.addAttribute("attribute", new Attribute());
        return "products/attribute_add";
    }


    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String save(Model model, @PathVariable Long prod_id, @Valid Attribute attribute, BindingResult result) {
        Product product = attributeService.getProduct(prod_id);
        if (product == null) {
            return "products/products";
        }

        // ...
    }

    // ...
}

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

    这可以通过HandlerInterceptor 完成。您需要做的就是扩展HandlerInterceptorAdapter#preHandle,然后通过WebMvcConfigurer#addInterceptors 注册您的拦截器。您可以选择将拦截器用于所有映射或通过InterceptorRegistration 对象与某些特定映射器一起使用,该对象由InterceptorRegistry#addInterceptor 方法返回。

    顺便说一下,HandlerInterceptors 对于一般的请求和响应执行一些实用操作很有用,例如日志记录、添加标头、身份验证等。对于与业务相关的操作,我建议使用 ControllerAdvice 和自定义面向业务的异常。在这种情况下,它将是一个从数据库中检索Product 并在未找到时抛出自定义异常的方法。

    【讨论】:

    • 是否可以在每个方法中使用Product product 而无需再次从数据库中检索它?
    • 您可以使用标准的ServletRequest 方法在请求中存储一些对象。
    • HandlerInterceptor 是一个标准的 Spring bean,可以自动装配任何 Spring bean。但是你想在拦截器中使用 DB 是很奇怪的,因为它基本上用于一些常见的实用操作,如日志记录、身份验证、欺诈保护等。但是如果你需要,你可以轻松地注入你的 bean。确保您没有将拦截器自动装配到您的服务类,并且您在上下文配置中将拦截器声明为 Spring bean。
    • 我使用stackoverflow.com/questions/18218386/…解决了这个问题
    • 我会使用自定义方法从 DB 获取产品,如果找不到则抛出异常,然后使用简单的ControllerAdvice 管理异常
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多