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

时间:2015-04-10 11:05:57

标签: spring validation data-binding spring-security spring-roo

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

1 个答案:

答案 0 :(得分:2)

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

其次,您可以使用验证组对同一实体进行不同的验证。 Thisthis是两个帖子。

一个例子:

@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();          
   }
}
祝你好运!