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();
}
}
祝你好运!
我有一个 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();
}
}
祝你好运!