spring: 数据绑定和验证之间的钩子

spring: hook between data binding and validation

我有一个 Roo 生成的应用程序并使用验证,spring 安全性与自定义 PermissionEvaluator 和生成的 Web 控制器。我的实体有一个这样的字段:

@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 调用)也缺少该值。如何将我的代码放在数据绑定和验证之间,以便实体从一开始就完整?

要解决 @PreAutorize 的问题,请将持久性逻辑移动到 @Service bean 并从控制器调用它。这样安全检查将在验证之后进行。 Roo 可以通过 service command.

帮助您

其次,您可以使用验证组对同一实体进行不同的验证。 This and this 是两个 howto post。

一个例子:

@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();          
   }
}

祝你好运!