2017-11-01 2 views
0

Ich versuche, ein einfaches Validierungsformular mit Hibernate Validator zu erstellen. Ich habe zwei Felder in meiner Kundenklasse, und ich möchte eine von ihnen (lastName) benötigt. Der Punkt ist, dass selbst wenn ich dieses Feld nicht ausfüllen werde ich keine Fehlermeldung erhalten und BindingResult enthält keine Fehler. Fehlt etwas in meinem Code?Hibernate-Validator @NotNull funktioniert nicht richtig

Hier ist mein Customer-Klasse-Snippet.

public class Customer { 

    private String firstName; 

    @NotNull(message = "is required") 
    @Size(min = 1, message = "is required") 
    private String lastName; 

    public String getFirstName() { 
     return firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

Hier ist Controller-

@Controller 
@RequestMapping("/customer") 
public class CustomerController { 

    //adding new customer to model 
    @RequestMapping("/showForm") 
    public String showForm(Model theModel){ 

     theModel.addAttribute("customer", new Customer()); 

     return "customer-form"; 
    } 

    //Validating passed customer attribute/object 
    //Biding result object holds validation results 
    @RequestMapping("/processForm") 
    public String processForm(
      @Valid @ModelAttribute("customer") Customer theCustomer, BindingResult theBindingResult) { 

     if (theBindingResult.hasErrors()){ 
      return "customer-form"; 
     } 

     return "customer-confirmation"; 
    } 
} 

EDIT: Formularcode:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 

<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<html> 
<head> 
    <title>Customer Registration Form</title> 
</head> 
<body> 

<style> 
    .error{color: red} 
</style> 


<i> Fill out the form. Asteriks (*) means required. </i> 
<br><br> 
<form:form action="processForm" modelAttribute="customer"> 

    First name: <form:input path="firstName" /> 

    <br><br> 

    Last name (*): <form:input path="lastName"/> 
    <form:errors path="lastName" cssClass="error" /> 
    <input type="submit" value="Submit"/> 

</form:form> 

</body> 
</html> 

EDIT 2: Ich habe validation-api.jar (enthält das abstrakte API und die Anmerkung Classpath Scanner).

Auch eingefügt @InitBinnder nur um sicherzustellen, dass das leere Formularfeld immer Null ist nicht leer String.

@InitBinder 
public void initBinder(WebDataBinder dataBinder) { 

    StringTrimmerEditor stringTrimmerEditor = new StringTrimmerEditor(true); 

    dataBinder.registerCustomEditor(String.class, stringTrimmerEditor); 
} 

Aber es scheint immer noch, dass diese Anmerkungen nie an allen

3 EDIT ausgelöst werden: Nach dem Validierer Entity Aufruf Ich erhalte Fehler:

org.springframework.web.util.NestedServletException : Anfrageverarbeitung fehlgeschlagen; Die verschachtelte Ausnahme ist javax.validation.NoProviderFoundException: Es konnte keine Konfiguration erstellt werden, da kein Bean Validation-Provider gefunden werden konnte. Fügen Sie Ihrem Klassenpfad einen Anbieter wie Hibernate Validator (RI) hinzu.

obwohl ich es hinzugefügt haben

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
Validator validator = factory.getValidator(); 
validator.validate(theCustomer); 

EDIT 4 bis Classpath: Hinzufügen von Spring-Konfigurationsdateien:

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
    id="WebApp_ID" version="3.1"> 

    <display-name>mvc-validation-demo</display-name> 

    <!-- Spring MVC Configs --> 

    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/mvc-validation-demo.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

</web-app> 

mvc-Validierung-demo.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context.xsd 
      http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc.xsd 
      http://www.springframework.org/"> 

    <context:component-scan base-package="com.lobo.mvc" /> 

    <mvc:annotation-driven/> 

    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/view/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

</beans> 

EDIT 5: Nach dem, was gesagt @eis ich zu meinem mvc-Validierung-demo.xml hinzugefügt:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalVa‌​lidatorFactoryBean"/‌​> 

Und ich habe auch Hibernate Validator in meinem Classpath:

Classpath

aber die Fehler bleibt immer noch

+0

Also, was ist der Wert der Nachname des Kunden? Was ist seine Länge? –

+0

Ich gebe in meiner Form keinen Wert dafür. Also ist die Länge 0. – Mitsuomi

+0

Haben Sie * denken * es ist 0, oder wissen Sie * es ist 0, weil Sie den Wert von 'theCustomer.getLastName(). Length()' gedruckt haben und die Ausgabe 0 war? Haben Sie die Validierung wie hier erläutert aktiviert: https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation-beanvalidation-spring? –

Antwort

0

Löschen .idea, Cache leeren und neue Konfiguration hat den Job für mich erledigt. Es scheint, dass es irgendwie nicht Hibernate-validator.jar gesehen hat.

Vielen Dank an alle, die dazu beigetragen haben.