@RequestMapping(value = "/products/create", method = RequestMethod.POST)
public ModelAndView create(@Valid ProductForm productForm, BindingResult bindingResult,
HttpServletRequest request) {
SessionContext sessionContext = (SessionContext) request.getAttribute("sessionContext");
ModelAndView mav = new ModelAndView("products/new");
mav.addObject("errors", bindingResult.getAllErrors());
mav.addObject("productForm", productForm);
int newProductId = -1;
if (!bindingResult.hasErrors()) {
List<Product> products = productService.find...(...);
if (products != null...) {
bindingResult.addError(new ObjectError("Products", "..."));
}
// only try and create if no errors so far
if (!bindingResult.hasErrors()) {
newProductId = productService.create(..., productForm);
if (newProductId <= 0) {
bindingResult.addError(new ObjectError("Products", "..."));
}
}
}
if (bindingResult.hasErrors()) {
return mav;
}
return new ModelAndView("redirect:/products/show/" + newProductId);
}
所以上面描述了 UI 方面的事情(使用 Spring MVC)。
现在,我应该如何设计服务层,所以在这个例子中 ProductServiceImpl 有一个 create 方法,它将创建产品并将其保存在数据库中。
我必须根据用户角色等检查权限。
我可以通过首先检查用户是否有权创建产品来在 UI 层中做到这一点:
if(permissionService.hasPermission(.....)) {
newProductId = productService.create(....)
}
但这将这个逻辑与 UI 层联系在一起,我认为它应该在 create 方法本身中:
public class ProductServiceImpl implements ProductService {
@Autowired
PermissionService permissionService;
..
@Override
public int create(...., final ProductForm productForm) {
boolean canCreateProduct = productService.hasPermissions(.....);
if(canCreateProduct) {
Product product = ..... (productForm);
productDao.save(product);
return product.getId();
}
}
}
但是我无法理解的问题是,如果我将权限检查放在 ProductServiceImpl.create 方法中,我如何向 UI 层报告您没有权限执行此操作?
如果你说我应该抛出一个异常,那么我的 UI 层看起来非常混乱,因为根据我需要执行的各种检查,我将有很多异常需要处理。
我应该在这里做什么?