我无法正确进行方法级别验证。或者我不明白它是如何运作的。
我的申请类如下。非常简单。它包含MethodValidationPostProcessor
bean定义。它还运行Greeter服务。
@SpringBootApplication
public class App implements CommandLineRunner {
private final Greeter greeter;
public App(Greeter greeter) {
this.greeter = greeter;
}
public static void main(String[] args) {
new SpringApplicationBuilder().main(App.class).sources(App.class).web(false).run(args).close();
}
@Bean
public org.springframework.validation.beanvalidation.MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
@Override
public void run(String... args) throws Exception {
final Input input = new Input();
input.setName("j");
final String messageFromInput = greeter.getMessageFromInput(input);
final String messageFromString = greeter.getMessageFromString("j");
}
}
以下的迎宾服务。在这里,我希望验证输入和输出。
@Service
@Validated
public class Greeter {
String getMessageFromInput(@Valid @NotNull Input name) {
return "[From Input] Greetings! Oh mighty " + name + "!";
}
String getMessageFromString(@Size(min = 4) String name) {
return "[From String] Greetings! Oh mighty " + name + "!";
}
}
输入DTO也非常简单。
public class Input {
@NotEmpty
@Size(min = 3)
private String name;
// Getters, setters and toString ommited.
}
由于两种情况下的名称,直接String和DTO,只有一个字母,我希望此设置抛出异常。不幸的是,没有任何事情发生,应用程它适用于控制器的方法。但我希望它可以使用任何bean的方法。
答案 0 :(得分:2)
您正在将Greeter
bean作为构造函数参数注入到使用@SpringBootApplication
注释的类中,该类是@Configuration
类。为了满足该依赖性,Greeter
在ApplicationContext
的启动过程中很早就创建了,因此将其作为代理创建的候选者删除。
不是将其作为构造函数参数注入,而是将CommandLineRunner
逻辑移动到@Bean
带注释的方法,并简单地将Greeter
作为依赖项注入。这将延迟bean的创建,因此可以用于代理。
@Bean
public CommandLineRunner runner(Greeter greeter) {
return new CommandLineRunner() {
@Override
public void run(String... args) throws Exception {
final Input input = new Input();
input.setName("j");
final String messageFromInput = greeter.getMessageFromInput(input);
final String messageFromString = greeter.getMessageFromString("j");
}
};
}
另一件事是,由于代理的性质Greeter
,public
的方法应该是array
。