验证不适用于spring boot和hibernate

问题描述 投票:1回答:1

我是spring boot和hibernate的新手。我已经声明了一个模型类Office,它是:

package com.ashwin.officeproject.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import java.util.Date;

@Entity
@Table(name = "office")
public class Office {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long officeId;

    @NotEmpty(message = "{officename.notempty}")
    private String officeName;

    @NotNull
    private int officeNumber;

    /*@Size(min = 8, max = 72, message = "Your offc address between 8 and 72 characters long")*/
    /*@NotEmpty(message = "Please provide a offc name")*/
    private String officeAddress;

    public Office() {

    }

    //ommitted getters and setters
}

我宣布我的第一个主要的起始类是:

package com.ashwin.officeproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

@SpringBootApplication
public class OfficeProjectApplication {

    public static void main(String[] args) {
        SpringApplication.run(OfficeProjectApplication.class, args);
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource
          = new ReloadableResourceBundleMessageSource();

        messageSource.setBasename("classpath:messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

    @Bean
    public LocalValidatorFactoryBean getValidator() {
        LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
        bean.setValidationMessageSource(messageSource());
        return bean;
    }

}

我的控制器类是:

package com.ashwin.officeproject.controller;

import java.util.ArrayList;
import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.ashwin.officeproject.model.Office;
import com.ashwin.officeproject.repository.OfficeRepsitory;

@Controller
public class MainController {

    @Autowired
    OfficeRepsitory officeRepository;


    @RequestMapping(value = { "/office"}, method = RequestMethod.GET)
    public String office(Model model) {
       model.addAttribute("offices", new Office()); 
      return "office";
    }

    @RequestMapping(value = "/addOffice", method = RequestMethod.POST)
    public String submit(@Valid @ModelAttribute("offices") Office office, 
      BindingResult result, ModelMap model) {
        if (result.hasErrors()) {
            return "error";
        }
        officeRepository.save(office);
        model.addAttribute("offices", new Office()); 
        return "office";
    }

}

我有一个office.jsp页面,它是:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<jsp:include page="./header.jsp" />
 <style>
      .error {
         color: #ff0000;
      }

      .errorblock {
         color: #000;
         background-color: #ffEEEE;
         border: 3px solid #ff0000;
         padding: 8px;
         margin: 16px;
      }
   </style>
    <form:form method="POST"  action="/addOffice"   modelAttribute="offices"  >

             <table>
                <tr>
                    <td><form:label path="officeName">Name</form:label></td>
                    <td><form:input path="officeName"/></td>
                    <form:errors path = "officeName" cssClass = "error" />

                </tr>
                <tr>
                    <td><form:label path="officeNumber">Number</form:label></td>
                    <td><form:input path="officeNumber"/></td>


                </tr>
                <tr>
                    <td><form:label path="officeAddress">
                      Address</form:label></td>
                    <td><form:input path="officeAddress"/></td>


                </tr>
                <tr>
                    <td><input type="submit" value="Submit"/></td>
                </tr>
            </table>
        </form:form>


<jsp:include page="./footer.jsp" />    

我的pom.xml是:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ashwin</groupId>
    <artifactId>OfficeProject</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>OfficeProject</name>
    <description>OfficeProject</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.12.Final</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

当我单击提交按钮时,如果我的表单中的输入字段为空,我想验证我的表单并在输入字段下方显示消息,如“请提供有效的办公室名称”。但是当我点击时,发生了什么提交按钮,然后它将转到我的error.jsp页面,但它没有显示我上面声明的任何验证消息。我的错误页面显示是:

error.jsp文件

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<p>Error</p>
</body>
</html>      

我在eclipse中的控制台中也没有出现任何错误。当我的表单字段为空时,它只是在error.jsp页面中重定向。

java spring hibernate spring-boot bean-validation
1个回答
0
投票

似乎jar冲突问题,因为org.hibernate.validator:hibernate-validator:jar(javax.validation:validation-api:jar is part of hibernate validator)是spring web依赖的一部分所以不需要添加可能冲突的额外依赖,因此建议删除下面的依赖项并通过clean install(mvn clean install)再次构建项目。

删除以下依赖项:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.12.Final</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

并确保您访问下面的错误消息:不需要大括号和属性名称与您定义的实际消息属性名称匹配。(camelcase与名称有关)。

@NotEmpty(message = "officename.notempty")
© www.soinside.com 2019 - 2024. All rights reserved.