我一直在按照我在Spring Petclinic示例应用程序中发现的内容为我的Web应用程序构建带有验证器的Spring MVC(3.2 / 4.0)控制器。但是,在示例应用程序中,使用new
关键字在相关的控制器中创建了验证器,从而产生了紧密的耦合。现在,我正在编写覆盖此代码的测试,由于这种耦合,事实证明很难隔离这些类。
是否有建议的方法将验证器与控制器解耦?还有其他解决方案吗?
这是我的意思是紧结合的Petclinic应用示例:
@RequestMapping(value = "/owners/{ownerId}/pets/new", method = RequestMethod.POST)
public String processCreationForm(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) {
new PetValidator().validate(pet, result);
if (result.hasErrors()) {
return "pets/createOrUpdatePetForm";
} else {
this.clinicService.savePet(pet);
status.setComplete();
return "redirect:/owners/{ownerId}";
}
}
最佳答案
在您的应用程序上下文中将Petvalidator定义为Bean,并对控制器进行以下更改
@RequestMapping(value = "/owners/{ownerId}/pets/new", method = RequestMethod.POST)
public String processCreationForm(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) {
PetValidator petValidator; //change this line
petValidator.validate(pet,result); //change this line
if (result.hasErrors()) {
return "pets/createOrUpdatePetForm";
} else {
this.clinicService.savePet(pet);
status.setComplete();
return "redirect:/owners/{ownerId}";
}
}
而且,您可以使用属性注入将适当的Petvalidator注入到控制器中。如果您使用组件扫描,请添加以下内容将注册的Bean自动连接到控制器中。
@Autowired
PetValidator petValidator;
在控制器内部而不是
PetValidator petvalidator;