2017-07-08 2 views
1

Ich arbeite an dem Kapitel 5 Beispiel des Buches Frühling in Aktion 4. Wenn ich die Test-Klassen ausgeführt habe, fand ich einen der @Valid Test nicht funktioniert, es scheint, als ob Die Validierung ist nie erfolgt (der Statuscode 302 wurde zurückgegeben und der Name der Ansicht lautet "/ spitter/null"). Es funktioniert jedoch einwandfrei, wenn ich es in Tomcat starte.Test @Valid Annotation mit SpringMVC Maven

Die Validatio-Gläser (Hibernate-Validator und seine Abhängigkeiten) werden mit Maven geladen.

Das ganze Projekt ist auf github.

Irgendwelche Ideen?

Test Code-Schnipsel:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes={RootConfig.class, WebConfig.class}) 
public class SpitterControllerTest { 
    @Test 
    public void shouldFailValidationWithNoData() throws Exception { 
     SpitterRepository mockRepository = mock(SpitterRepository.class);  
     SpitterController controller = new SpitterController(mockRepository); 
     MockMvc mockMvc = standaloneSetup(controller).build(); 

     mockMvc.perform(post("/spitter/register")) 
      .andExpect(status().isOk()) 
      .andExpect(view().name("registerForm")) 
      .andExpect(model().errorCount(5)) 
      .andExpect(model().attributeHasFieldErrors(
       "spitter", "firstName", "lastName", "username", "password", "email")); 
    } 
} 

SpitterController Schnipsel:

@RequestMapping(value="/register", method=POST) 
    public String processRegistration(
     @Valid Spitter spitter, 
     Errors errors) { 
    if (errors.hasErrors()) { 
     return "registerForm"; 
    } 

    spitterRepository.save(spitter); 
    return "redirect:/spitter/" + spitter.getUsername(); 
    } 

Spitter-Schnipsel:

@NotNull 
    @Size(min=5, max=16) 
    private String username; 

    @NotNull 
    @Size(min=5, max=25) 
    private String password; 

    @NotNull 
    @Size(min=2, max=30) 
    private String firstName; 

    @NotNull 
    @Size(min=2, max=30) 
    private String lastName; 

    @NotNull 
    @Email 
    private String email; 

Vielen Dank!

+0

Ist die Verwendung von StandaloneSetup erforderlich? Haben Sie stattdessen webAppContextSetup in Betracht gezogen? –

+0

Ich habe gerade webAppContextSetup ausprobiert und eine '' 'org.springframework.dao.DataIntegrityViolationException''' geworfen, weil das Einfügen von null für den Spalten-Benutzernamen nicht erlaubt ist.Trotzdem ist die '' '@ Valid'' Validierung nicht aufgetreten. Wenn es gültig ist, sollte die Ausnahme nicht ausgelöst worden sein. – fall

Antwort

0

Ich versuchte diese post 's beste Antwort und es hat funktioniert. Ich änderte die hibernate-validator Version von 5.4.1.final zu 5.2.4.final in Pom. Das Projekt github wird ebenfalls aktualisiert.

0

Mark Ihre SpitterController mit @Validated

import org.springframework.validation.annotation.Validated; 

@Controller 
@Validated 
@RequestMapping("/spitter") 
public class SpitterController { 

@Autowired die SpitterController und erstellen MethodValidationPostProcessor Bohne, die Delegierten zu einem JSR-303 Anbieter für die Durchführung auf kommentierten Methoden Methode Ebene Validierung, wie folgt:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes = { RootConfig.class, WebConfig.class, 
     SpitterControllerTest.Config.class }) 
public class SpitterControllerTest { 

    @Autowired 
    private SpitterController spitterController; 

    @Configuration 
    public static class Config { 
     @Bean 
     public MethodValidationPostProcessor methodValidationPostProcessor() { 
      return new MethodValidationPostProcessor(); 
     } 
    } 

    @Test 
    public void shouldFailValidationWithNoData() throws Exception { 
    } 

} 
0

I klonte dein Repository und war in der Lage, die valiation zu erhalten, indem du deine jsp-api-Abhängigkeit auf 2.2

0 aktualisierte
<dependency> 
    <groupId>javax.servlet.jsp</groupId> 
    <artifactId>jsp-api</artifactId> 
    <version>2.2</version> 
    <scope>provided</scope> 
</dependency> 

Es gibt neuere Versionen dieser Abhängigkeit, die Sie sich ansehen sollten. Bei der Verwendung der Version 2.1 wurden keine Validierer zu ExtendedServletRequestDataBinder registriert oder hinzugefügt, genauer gesagt war SpringValidatorAdapter targetValidator null.

Die Ursache war, dass die Ausnahme unten in OptionalValidatorFactoryBean.afterPropertiesSet

javax.validation.ValidationException geworfen wurde: HV000183: Kann nicht 'javax.el.ExpressionFactory' initialisieren. Überprüfen Sie, ob Sie die EL-Abhängigkeiten auf dem Classpath haben, oder verwenden Sie ParameterMessageInterpolator statt

Ich habe bemerkt, dass Sie Ihre shouldFailValidationWithNoData Test aktualisiert webAppContextSetup zu verwenden, aber immer noch einen Anruf zu mock(SpitterRepository.class) haben, die nicht notwendig ist.

+0

Danke für die webAppContextSetup Beratung. Ich versuchte, jsp-api zu aktualisieren, und es funktionierte nicht auf meiner Maschine, aber eine andere Lösung (https://stackoverflow.com/questions/24386771/javax-validation-validationexception-hv000183-unable-to-load-javax-el-express) zu der Ausnahme, die du beschrieben hast, hat mein Problem gelöst. Ich habe die 'hibernate-validator'-Version von' 5.4.1.final' in '5.2.4.final' in pom geändert. – fall

Verwandte Themen