@RequestMappings

时间:2017-12-22 17:49:20

标签: spring spring-mvc

Servlet中,您可以添加@Override service方法,该方法在doGetdoPost之前调用,有没有办法在Spring中实现相同的目标@Controller {1}}?

或者更准确地说,在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";
        }

        // ...
    }

    // ...
}

1 个答案:

答案 0 :(得分:1)

可以使用HandlerInterceptor完成此操作。您需要做的就是扩展HandlerInterceptorAdapter#preHandle,然后通过WebMvcConfigurer#addInterceptors注册您的拦截器。您可以选择使用拦截器来处理所有映射,或者通过InterceptorRegistration对象使用某些特定的映射器,并使用InterceptorRegistry#addInterceptor方法返回。

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