我一直在按照我在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;

09-12 08:57