我有一个Roo生成的应用程序,并使用自定义PermissionEvaluator和生成的Web控制器进行验证,Spring安全性。我的实体有这样一个字段:
@NotNull
private Date creationDate;
保存实体时,此字段在控制器的创建方法中自动设置,并且不包含在表单中(render =" false")。
@RequestMapping(method = RequestMethod.POST, produces = "text/html")
@PreAuthorize("hasPermission(#myEntity, 'create')")
public String create(@Valid MyEntity myEntity,
BindingResult bindingResult, Model uiModel,
HttpServletRequest httpServletRequest) {
// ... check binding result
myEntity.setCreationDate(new Date());
myEntity.persist();
// ...
}
问题是,验证总是失败,因为它在设置字段之前运行。 PermissionEvaluator(由@PreAuthorize调用)也缺少该值。如何在数据绑定和验证之间放置我的代码,以便实体从一开始就完整?
答案 0 :(得分:2)
解决@PreAutorize
将持久性逻辑移动到@Service
bean并从控制器调用它的问题。这样安全检查将在验证后进行。 Roo可以通过service command帮助您。
其次,您可以使用验证组对同一实体进行不同的验证。 This和this是两个帖子。
一个例子:
@RequestMapping("/myEntity")
public MyEntityController {
@Autowired
MyEntityService myEntityService;
@RequestMapping(method = RequestMethod.POST, produces = "text/html")
public String create(@Validated({Account.ValidationStepOne.class}) MyEntity myEntity,
BindingResult bindingResult, Model uiModel,
HttpServletRequest httpServletRequest) {
// ... check binding result
myEntityService.save(myEntity);
//...
}
}
@Service
public MyEntityService {
@PreAuthorize("hasPermission(#myEntity, 'create')")
public save(MyEntity myEntity) {
//...
myEntity.setCreationDate(new Date());
myEntity.persist();
}
}
祝你好运!