Olá Fábio, muito obrigado pela sua atenção até aqui!
Realmente no primeiro trecho de código inserido aqui eu esqueci de colocar as aspas duplas no valor do atributo placeholder!
Mas, colocando-as agora, passo a ter um problema que até me é mais difícil de entender.
Ao usar o formulário desta forma, com a tag html padrão:
<form:form action="${s:mvcUrl('PC#gravar').build() }" method="POST" modelAttribute="pessoa">
<div class="form-group">
<label>Nome</label>
<input type="text" name="nome" class="form-control"/>
</div>
<div class="form-group messages-alert">
<form:errors path="nome"></form:errors>
</div>
<div class="form-group">
<label><fmt:message key="form.telefoneResidencialLabel"/></label>
<input type="text" name="telefoneResidencial" class="form-control" placeholder="<fmt:message key="form.telefoneResidencialPlaceholder"/>"/>
</div>
<div class="form-group messages-alert">
<form:errors path="telefoneResidencial"></form:errors>
</div>
</form:form>
Tudo funciona bem.
Mas ao usar o form com a tag do spring, recebo um "Neither BindingResult nor plain target object for bean name 'pessoa' available as request attribute".
Seria a tradução deste texto, nem o resultado do binding nem um objeto alvo claro para o objeto gerenciado pelo spring "pessoa" está disponível como um atributo na requisição ?
Eu tentei ler um pouco a respeito desse atributo modelAttribute no formulário e tive que coloca-lo no meu formulário pois justamente o spring estava esperando receber um objeto chamado "command" no formulário (como não dado nenhum nome ele utiliza este name como padrão). Logo quando eu coloquei o mesmo com o valor de "pessoa" ele bate com minha classe Pessoa do meu modelo e estava conseguindo enviar o formulário normalmente.
Mas eu estou com dificuldades neste tópico, e como o @ModelAttribute não foi algo abordado no curso, eu fiquei com essa lacuna aí. Eu vi algumas coisas a respeito do @ModelAttribute mas nada que eu tenha compreendido bem, por isso não vou citar aqui!
Mas a pergunta é, porque que quando utilizando a
input type="text" name=".."
do html não ocorre esse erro de binding e quando utilizando a form:input path do spring o mesmo passa a ocorrer ?
Não sei se eu fui muito claro, ou se é muita coisa, mas se alguém pudesse me dar uma luz sobre essas questões seria de grande ajuda!
Quase esqueço de colocar o controlador aqui e vou colocar a classe do modelo também ok...
@Controller
public class PessoaController {
@Autowired
PessoaDAO pessoaDAO;
@InitBinder
public void InitBinder(WebDataBinder binder) {
binder.addValidators(new PessoaValidacao());
new PessoaValidacao();
}
@RequestMapping(value = "/formPF", method = RequestMethod.GET)
public ModelAndView formPF() {
System.out.println("Entrando no formulário");
ModelAndView modelAndView = new ModelAndView("pessoa/formPF");
return modelAndView;
}
@RequestMapping(value = "/gravar", method = RequestMethod.POST)
public ModelAndView gravar(@Valid Pessoa pessoaFisica, BindingResult result, RedirectAttributes redirectAttributes) {
if (result.hasErrors()) {
return formPF();
}
pessoaDAO.gravar(pessoaFisica);
redirectAttributes.addFlashAttribute("msgSucesso", "Locatário cadastrado com sucesso");
return new ModelAndView("redirect:listaLocatarios");
}
@RequestMapping(value = "/listaLocatarios", method = RequestMethod.GET)
public ModelAndView listaLocatarios() {
List<Pessoa> lista = pessoaDAO.getLista();
ModelAndView modelAndView = new ModelAndView("pessoa/lista");
modelAndView.addObject("lista", lista);
return modelAndView;
}
}
@Entity
public class Pessoa {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Basic(optional = false)
private String nome;
@OneToOne(cascade = CascadeType.ALL)
@Basic(optional = false)
private Endereco endereco;
@Basic(optional = false)
private String telefoneResidencial;
@Basic(optional = false)
private String telefoneComercial1;
@Basic(optional = true)
private String telefoneComercial2;
@Basic(optional = false)
private String rg;
@Basic(optional = false)
private String documento;
@Basic(optional = true)
private Long tipo;
// getters and setters
}