【发布时间】:2015-12-17 11:19:38
【问题描述】:
我使用 JPA/Spring jpa/data/mvc/validation 并且我有这样的类结构:
波乔/@Entity:
@MappedSuperclass @public class Base {//}
@Entity public class Account extends Base {//}
JpaRepository 接口:
@NoRepositoryBean public interface BaseRepository<T extends Base> extends JpaRepository<T, Integer> {}
public interface AccountRepository extends BaseRepository<Account> {}
我为验证创建了验证类(Spring Validator),@Service、@Controller/@RestController 类将使用这些验证类。
我不喜欢在 pojo 类中添加任何验证 (@Max、@Min、@NotNull)!
public abstract class BaseValidator<T extends Base> implements Validator {}
@Component public class ConfigValidator extends BaseValidator<Config> {
public void validate(Object obj, Errors errors) { // basic (fields or multifields) validations
super.validate(obj, errors);
//other.validations.
}
public void addValidate(Account obj, Errors errors) { // business validations when add
validate(obj, errors);
super.addValidate(obj,errors);
//own add validations.
}
public void editValidate(Account obj, Errors errors) { // business validations when update }
public void delValidate(Account obj, Errors errors) { // business validations when add
validate(obj, errors);
super.delValidate(obj,errors);
//own delete validations.
}
}
将验证类与@Service 和@Controller/@RestController 集成的最佳方法是什么?
类似的东西?
@Service(服务层):(包装存储库+验证)
public abstract class BaseService<T extends Base>{ // }
@Service public class AccountService extends BaseService<Account> {
@Autowired AccountRepository repository;
@Autowired AccountValidator validator;
add(Account obj, Errors errors) {
// validator.validate(obj, errors)
// if (!errors.hasErrors())
// validator.add(obj, errors)
// if (!errors.hasErrors())
repository.add(obj)}
}
edit(Account ob, Errors errors) { // }
del(Integer id, Errors errors) {
Account obj = repository.findOne(id);
// validator.validate(obj, errors)
// if (!errors.hasErrors())
// validator.delValidate(obj, errors)
// if (!errors.hasErrors())
repository.del(id)}
}
// Problem: I don't have a class implements Erros internal call add/del methods. BeanPropertyBindingResult?
}
@Controller(控制层):
@Controller
@RequestMapping("/Account")
public class AccountController {
@Autowired AccountService service;
@RequestMapping(value = "/Add", method = RequestMethod.GET)
public String addForm(Model model) { // }
@RequestMapping(value = "/Add", method = RequestMethod.POST)
public String addAction(@Validated @ModelAttribute("entity") Account entity, BindingResult result, Model model) {
// if (accountService.add(entity, result) had errors)
// return to form with errors.
}
}
将验证类与@Service 和@Controller/@RestController 集成的最佳方式是什么?
【问题讨论】:
标签: spring validation service controller