gpt4 book ai didi

java - 使用 MethodValidationPostProcessor 进行 Spring 验证

转载 作者:搜寻专家 更新时间:2023-11-01 03:51:39 25 4
gpt4 key购买 nike

我正在尝试使用 Spring 的 MethodValidationPostProcessor用于在我的服务层上进行验证。我曾计划创建一个通用服务接口(interface)并让 Controller 按类型注入(inject)正确的服务:

@Controller
@RequestMapping("/items")
public class ItemController {

@Inject
// inject a service for the domain type i am controller for
private Service<Item> service;

@RequestMapping(method = RequestMethod.POST, produces="application/json")
public @ResponseBody Item create(@RequestBody Item item){
return this.service.execute(item);
}
}

我有一个通用的服务定义和一个简单的实现:

public interface Service<T> {
public T execute(@Valid T item);
}

// example implementation:
@Named
@Validated
public class ItemService implements Service<Item>{

@Override
public Item execute(@Valid Item item) {
return item;
}
}

然后设置我的应用程序以包含 Spring MethodValidationPostProcessor处理@Validated bean 类:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main( String[] args ){
SpringApplication application = new SpringApplication(Application.class);
application.run(args);
}

@Bean
public MethodValidationPostProcessor getMethodValidationPostProcessor(){
MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
processor.setValidator(this.validator());
return processor;
}

@Bean
public LocalValidatorFactoryBean validator(){
return new LocalValidatorFactoryBean();
}
}

此设置会产生以下异常:

HV000162: The validated type org.commons.test.validation.ItemService does not specify the constructor/method: public abstract java.lang.Object org.commons.test.validation.Service.execute(java.lang.Object)

我很确定这是由于传递给 validator 的代理造成的,但我似乎无法解决这个问题。我确定这必须有效(因为我确定 Spring 人员已经想到了这一点)而且我只是遗漏了一些东西......将不胜感激任何帮助。

更新:

所以我发现如果Service<T>是一个抽象类,而不是一切正常的接口(interface)。同样,如果我离开 Service<T>作为接口(interface),只需向方法添加另一个参数即:execute(String dummy, @Valid T value)这也会导致验证按预期工作。我开始认为这是一个错误...

最佳答案

ItemService 实现中删除 @Valid。通常只在接口(interface)级别需要。您的代码应如下所示。

// example implementation:
@Named
@Validated
public class ItemService implements Service<Item>{

@Override
public Item execute(Item item) {
return item;
}
}

关于java - 使用 MethodValidationPostProcessor 进行 Spring 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25984128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com