在Servlet
中,您可以添加@Override service
方法,该方法在doGet
或doPost
之前调用,有没有办法在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";
}
// ...
}
// ...
}
答案 0 :(得分:1)
可以使用HandlerInterceptor
完成此操作。您需要做的就是扩展HandlerInterceptorAdapter#preHandle
,然后通过WebMvcConfigurer#addInterceptors
注册您的拦截器。您可以选择使用拦截器来处理所有映射,或者通过InterceptorRegistration
对象使用某些特定的映射器,并使用InterceptorRegistry#addInterceptor
方法返回。
顺便说一句,HandlerInterceptor
对于一般的请求和响应进行一些实用操作很有用,比如日志记录,添加标题,身份验证等。对于与业务相关的操作,我建议使用{{3}使用自定义面向业务的异常。在这种情况下,它将是一种从数据库中检索Product
并在未找到时抛出自定义异常的方法。