Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro ao enviar Form e erro no mvcUrl().build

Olá, estou com um NullPointerException ao cadastrar o form e com um erro dentro do form.jsp no:

<form:form action="${s:mvcUrl('gravar').build()}" method="POST" commandName="produto">

erro: The method getBuild() is undefined for the type MvcUriComponentsBuilder.MethodArgumentBuilder

NullPointerException:

GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/casadocodigo] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException at br.com.casadocodigo.loja.validation.ProdutoValidation.validate(ProdutoValidation.java:26) at org.springframework.validation.DataBinder.validate(DataBinder.java:763) at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.validateIfApplicable(ModelAttributeMethodProcessor.java:161) at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:109) at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:79) at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)

3 respostas

ProdutoValidation

package br.com.casadocodigo.loja.validation;

import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator;

import br.com.casadocodigo.loja.models.Produto;

public class ProdutoValidation implements Validator {

@Override
public boolean supports(Class<?> clazz) {

    return Produto.class.isAssignableFrom(clazz);
}

// Metodo de validação
@Override
public void validate(Object target, Errors errors) {
    ValidationUtils.rejectIfEmpty(errors, "titulo", "field.required");
    ValidationUtils.rejectIfEmpty(errors, "descricao", "field.required");

    Produto produto = new Produto();
    produto = (Produto) target;
    if(produto.getPaginas() <= 0) {
        errors.rejectValue("paginas", "field.required");
    }

}

}

ProdutoController

package br.com.casadocodigo.loja.controllers;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import br.com.casadocodigo.loja.daos.ProdutoDAO; import br.com.casadocodigo.loja.models.Produto; import br.com.casadocodigo.loja.models.TipoPreco; import br.com.casadocodigo.loja.validation.ProdutoValidation;

@Controller @RequestMapping("/produtos") public class ProdutosController {

@Autowired
private ProdutoDAO produtoDao;

@RequestMapping("/form")
public ModelAndView form() {
    ModelAndView modelAndview = new ModelAndView("produtos/form");
    modelAndview.addObject("tipos",TipoPreco.values());

    return modelAndview;
}

// Metodo para gravar no banco de dados
@RequestMapping(name="gravar", method=RequestMethod.POST)
public ModelAndView gravar(@Valid Produto produto, BindingResult result, RedirectAttributes redirectAttributes) {

    if(result.hasErrors()) {
        return form();
    }

    System.out.println(produto.toString());
    produtoDao.inserir(produto);     
    redirectAttributes.addFlashAttribute("sucesso","Produto cadastrado com sucesso");
    return new ModelAndView("redirect:produtos");
}

// Metodo para listar do banco de dados na aplicação
@RequestMapping(method=RequestMethod.GET)
public ModelAndView listar() {
    List<Produto> produtos = produtoDao.listar();
    ModelAndView modelAndView = new ModelAndView("produtos/lista");
    modelAndView.addObject("produtos", produtos);

    return modelAndView;
}

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.addValidators(new ProdutoValidation());
}

}

form.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>

    <form:form action="${s:mvcUrl('gravar').build()}" method="POST" commandName="produto">
        <div>
            <label>Titulo</label>
            <input type="text" name="titulo">    
            <form:errors path="titulo"/>            
        </div>
        <div>
            <label>Descrição</label>
            <textarea rows="10" cols="20" name="descricao"></textarea>
            <form:errors path="descricao"/>
        </div>
        <div>
            <label>Paginas</label>
            <input type="text" name="paginas">
            <form:errors path="paginas"/>
        </div>
        <c:forEach items="${tipos}" var="tipoPreco" varStatus="status" >
            <div>
                <label>${tipoPreco}</label>
                <input type="text" name="precos[${status.index}].valor">
                <input type="hidden" name="precos[${status.index}].tipo" value="${tipoPreco}">
            </div>
        </c:forEach>
        <button type="submit">Cadastrar</button>        

    </form:form>
</body>

Não consigo achar nada sobre esses erros na internet, já vasculhei o fórum e não achei algo que ajudasse a resolver, se puderem me ajudar ficarei grato ! Obrigado.

solução!

NullPointerException corrigido.

erro:

    if(produto.getPaginas() <= 0) {
        errors.rejectValue("paginas", "field.required");
    }

correção:

    if(produto.getPaginas() == null) {
        errors.rejectValue("paginas", "field.required");
    }

estava dando NullPointerException pois o produto não estava sendo populado antes de fazer a verificação, então quando fazia a verificação <= 0 dava o nullPointerException.