SpringBoot验证bean方法参数并返回

时间:2017-03-13 02:10:31

标签: java spring-boot bean-validation

我无法正确进行方法级别验证。或者我不明白它是如何运作的。

我的申请类如下。非常简单。它包含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的方法。

1 个答案:

答案 0 :(得分:2)

您正在将Greeter bean作为构造函数参数注入到使用@SpringBootApplication注释的类中,该类是@Configuration类。为了满足该依赖性,GreeterApplicationContext的启动过程中很早就创建了,因此将其作为代理创建的候选者删除。

不是将其作为构造函数参数注入,而是将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");
        }
    };
}

另一件事是,由于代理的性质Greeterpublic的方法应该是array