@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)。服務層設計,在哪裏檢查權限,以及如何處理UI層
現在,我應該如何設計服務層,因此在本例中,ProductServiceImpl具有創建方法,該方法將創建產品並將其保存在數據庫中。
我要檢查的權限,根據用戶的角色等
我可以給這個UI層首先檢查用戶是否有權限創建一個產品:
if(permissionService.hasPermission(.....)) {
newProductId = productService.create(....)
}
但這種關係這個邏輯到UI層,我想應該是在創建方法本身:
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();
}
}
}
但我不明白的問題是,如果I p在ProductServiceImpl.create方法中檢查權限,我如何向UI層報告您沒有權限執行此操作?
如果你說我應該拋出一個異常,那麼我的UI層看起來非常混亂,因爲我會根據我需要執行的各種檢查來處理這麼多異常。
我應該在這裏做什麼?
我對AOP並不熟悉,這個應用程序在這些檢查方面非常輕,所以我寧願把它放在服務層或UI等。 – Blankman
正如你在你的問題中已經提出的,把在創建方法中檢查並在檢查失敗時拋出異常是最好的選擇。 – Torious
好吧,這是開始有意義的,我執行權限檢查,以防止頁面加載在第一位,但如果他們嘗試繞過,如果我拋出一個例外,這將是很好,因爲它會是一個罕見的情況下對嗎? – Blankman