Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation Spring框架<;形式:错误/>;标记不显示错误_Validation_Spring Mvc_Hibernate Validator_Spring Form - Fatal编程技术网

Validation Spring框架<;形式:错误/>;标记不显示错误

Validation Spring框架<;形式:错误/>;标记不显示错误,validation,spring-mvc,hibernate-validator,spring-form,Validation,Spring Mvc,Hibernate Validator,Spring Form,我知道这里有很多类似的问题,但没有一个解决了我的问题 我正在使用Spring4.0.3和HibernateValidator5.1.0。 当我试图省略标记的路径属性时,就会出现问题,因此: 有效 有效 不起作用 我不知道为什么会这样。SpringJavadocs(org.springframework.web.servlet.tags.form.ErrorsTag)说它应该像这样工作: 仅字段-将路径设置为字段名(或路径) 仅对象错误-忽略路径 所有错误-将路径设置为* 你能帮帮我吗 感兴趣的代

我知道这里有很多类似的问题,但没有一个解决了我的问题

我正在使用Spring4.0.3和HibernateValidator5.1.0。 当我试图省略
标记的
路径
属性时,就会出现问题,因此:

有效
有效
不起作用

我不知道为什么会这样。SpringJavadocs(org.springframework.web.servlet.tags.form.ErrorsTag)说它应该像这样工作:

仅字段-将路径设置为字段名(或路径)
仅对象错误-忽略路径
所有错误-将路径设置为*

你能帮帮我吗

感兴趣的代码位于ContatoController.java的“edicao.jsp”和“confirmaredico”方法中。对不起,如果我的英语不好


ContatoController.java

@Controller
@RequestMapping("/contatos")
public class ContatoController {

    @Autowired
    private ContatoService contatoService;

    @Autowired 
    private MessageSource messageSource;

    @RequestMapping(value = "/confirmarEdicao", method = RequestMethod.POST)
    public String confirmarEdicao(@Valid Contato contato, BindingResult bindingResult) {

        if(bindingResult.hasErrors()) {
            return "contatos/edicao";
        }

        contatoService.save(contato);
        return "redirect:/contatos";
    }

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView form(HttpServletRequest request) {
        String message = messageSource.getMessage("teste", null, new Locale("pt", "BR"));
        System.out.println(message);
        return new ModelAndView("contatos/listagem")
            .addObject("contatos", contatoService.list());
    }

    @RequestMapping("/remover/{id}")
    public String remover(Contato contato) {
        contatoService.delete(contato);
        return "redirect:/contatos";
    }

    @RequestMapping("/editar/{id}")
    public ModelAndView formEdicao(Contato contato) {
        contato = contatoService.find(contato.getId());
        return new ModelAndView("contatos/edicao")
            .addObject(contato);
    }


    @RequestMapping(value = "/cadastrar")
    public String formCadastro() {
        return "contatos/cadastro";
    }

    @RequestMapping(value = "/confirmarCadastro", method = RequestMethod.POST)
    public String confirmarCadastro(@Valid Contato contato, BindingResult bindingResult, 
            RedirectAttributes redirectAttributes) {        

        if (bindingResult.hasFieldErrors()) {
            return "contatos/cadastro";
        }

        contatoService.save(contato);
        redirectAttributes.addFlashAttribute("mensagem", "Contato cadastrado com sucesso.");
        return "redirect:/contatos";
    }   

    @ResponseBody
    @RequestMapping(value = "/pesquisar/{nome}", method = RequestMethod.GET, 
        produces="application/json")
    public List<Contato> pesquisar(@PathVariable String nome) {
        return contatoService.findByName(nome);
    }

}

应定义一些关键字:

  • 路径-指向对象或对象字段的类似EL的路径(例如
    foo
    foo.bar
    foo.bar.baz
  • 嵌套路径-当前路径上下文存储为
    nestedPath
    request属性(新路径与此路径相关)
  • 对象错误-与对象本身连接的错误(例如路径等于
    foo
  • 字段错误-与对象字段连接的错误(例如路径为
    foo.bar
标签
将嵌套路径定义为
nestedPath=foo
。编写
时,它会尝试查找为路径
foo.bar
定义的错误

假设您有与
foo
(对象错误)、
foo.bar
foo.bar.baz
(嵌套字段错误)相关的错误。这意味着什么:

  • 如果输入
    ,则仅显示绑定到
    foo
    路径的错误=>1条消息
  • 如果输入
    ,则仅显示绑定到
    foo.bar
    路径的错误=>1条消息
  • 如果输入
    ,将显示绑定到
    foo
    及其子路径的错误=>3条消息
  • 如果输入
    ,则仅显示
    foo.bar
    的子错误=>1条消息
  • 如果输入
    ,绑定到
    foo.bar
    及其子路径的错误将显示=>2条消息


检查类JavaDoc可能会给您提供更多的洞察力。

我认为省略路径意味着您根本不必编写该属性。从文件中删除路径属性tag@mserioli,这是一个复制粘贴错误,请查看已编辑的问题。那么问题到底是什么?对象错误是路径等于模型属性名称的错误。字段错误不是对象级错误。@问题是为什么edicao.jsp中的标记没有显示错误。据我所知,它应该显示Contato对象(以及控制器的confirmarEdicao方法中使用的任何其他对象)的错误。@user3576535 Nope。。。每个错误都与属性路径相关(例如
contato.id
=>
类型不匹配
)。此标记没有其
path
属性,仅显示当前嵌套路径的错误,在您的示例中为
contanto
。因此,不会显示子字段(例如,
contanto.nome
)错误。这就是JavaDoc告诉你的。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Editar contato</title>
</head>
<body>

<c:set var="context">${pageContext.request.contextPath}</c:set>
<script type="text/javascript">var context = "${context}";</script>
<script src="${context}/resources/js/jquery-2.1.0.min.js"></script>
<script src="${context}/resources/js/contatos/edicao.js"></script>

<form:form commandName="contato" action="${context}/contatos/confirmarEdicao" method="post">
<form:errors/>
    <table>
        <form:hidden path="id"/>
        <tr>
            <td>Nome:</td> 
            <td><form:input path="nome" /></td>
        </tr>
        <tr>
            <td>Telefone:</td>
            <td><form:input path="telefone"/></td>
        </tr>
        <tr>
            <td><input type="button" value="Voltar" id="btn_voltar"/><input type="submit" value="Salvar"/></td>         
        </tr>
    </table>
</form:form>

</body>
</html>
package com.handson.model;

import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;

public class Contato {

    private Long id;

    @Size(min = 3, message = "Nome deve ter no mínimo 3 caracteres")
    @NotEmpty(message = "O nome deve ser preenchido")
    private String nome;

    private String telefone;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public Contato withId(Long id) {
        setId(id);
        return this;
    }

    public Contato withTelefone(String telefone) {
        setTelefone(telefone);
        return this;
    }

    public Contato withNome(String nome) {
        setNome(nome);
        return this;
    }

    @Override
    public String toString() {
        return "Contato [id=" + id + ", nome=" + nome + ", telefone="
                + telefone + "]";
    }

}