2017-09-17 2 views
0

Ich habe einen Controller mit den folgenden:Warum schaltet mein Spring Boot Controller den Validator nicht automatisch ein?

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.GetMapping; 
import org.springframework.web.bind.annotation.RequestBody; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 

import javax.validation.Valid; 
import javax.validation.Validator; 

@RestController 
@RequestMapping("/") 
public class MyController { 

    @Autowired 
    private Validator validator; 

    //..elided... 

    @GetMapping 
    public String getSomething(@Valid @RequestBody MyRequest) { 

     //This is null 
     if (validator == null) { 
      throw new Exception("is null"); 
     } 
    } 
} 

Meine Konfigurationsklasse:

package com.app.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.validation.Validator; 
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 


@Configuration 
@EnableWebMvc 
@ComponentScan("com.app") 
public class ValidationConfig { 

    @Bean 
    public Validator validator() { 

     return new LocalValidatorFactoryBean(); 
    } 

    /* //Including this doesn't help 
    @Bean 
    public MethodValidationPostProcessor methodValidationPostProcessor() { 
     MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor(); 
     methodValidationPostProcessor.setValidator(validator()); 
     return methodValidationPostProcessor; 
    }*/ 
} 

Gradle:

buildscript { 
    ext { 
     springBootVersion = "1.5.6.RELEASE" 
    } 
     repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
    } 
} 

apply plugin: "java" 
apply plugin: "eclipse" 
apply plugin: "org.springframework.boot" 
apply plugin: "idea" 
apply plugin: "jacoco" 

jar { 
    baseName = "my-service" 
    version = "0.0.1-SNAPSHOT" 
} 

sourceCompatibility = 1.8 
targetCompatibility = 1.8 

repositories { 
    mavenCentral() 
} 

dependencies { 

    //Spring Boot 
    compile("org.springframework.boot:spring-boot-starter") 
    compile("org.springframework.boot:spring-boot-starter-web") 
    compile("org.springframework.boot:spring-boot-starter-actuator") 

    //Testing 
    testCompile("org.hamcrest:hamcrest-all:1.3") 
    testCompile("org.springframework.boot:spring-boot-starter-test") 
} 

Egal was ich tue, der Validator in meinem Controller ist null !

+0

verwenden Was diesen Code ist Bootstrapping? Das zu sehen, könnte weitere Einblicke liefern. –

+0

@ nicholas.hauschild Was meinst du? Ich laufe es mit '@RunWith (SpringRunner.class) @SpringBootTest public class TestMyController {'. –

+0

@ nicholas.hauschild Vielen Dank! Du hast mir geholfen, das Problem zu entdecken. Ich benutzte '@InjectMocks privaten MyController-Controller', und das ließ die' @ Autowired'-Felder darin leer. Das Ändern in '@Autowired @InjectMocks privater MyController-Controller' hat es behoben! Wenn du das als Antwort hinzufügst (zusammen mit deinem Kommentar), werde ich es als beantwortet markieren. –

Antwort

1

In Ihrem Controller erwarten Sie eine javax.validation.Validator aber in der config Sie org.springframework.validation.Validator

+0

Es ist immer noch Null, selbst nachdem Sie das behoben haben. (Ich habe beide die Frühlingsversion sein) –

+1

Ihr Controller hat keine "Paket" -Anweisung an der Spitze, und der Code würde nicht einmal kompilieren, da Sie Exception werfen, ohne es zu deklarieren. Könnten Sie den vollständigen echten Code einschließlich der Hauptklasse einfügen? – jhyot

Verwandte Themen