Boa tarde pessoal, tudo bem?
Estou desenvolvendo uma aplicação JSF Java web e estou com o seguinte problema:
Tenho um formulario em XHTM conforme abaixo :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
template="/template/ModeloSistema.xhtml"
xmlns:f="http://java.sun.com/jsf/core">
<ui:define name="menu">
<ui:include src="/include/menu.xhtml"></ui:include>
</ui:define>
<ui:define name="conteudo">
<!-- Painel Dados Município -->
<p:panel header="Dados da Obra">
<p:messages />
<h:form>
<p:growl id="growl" sticky="true" showDetail="true" />
<h:panelGrid id="cadObra" columns="6" columnClasses="label, value">
<h:outputLabel value="Município: " />
<h:inputText value="#{MBDadosObra.obraBean.municipio}"
required="true" label="Município:" />
<h:outputLabel value="Termo Aditivo (TA): " />
<h:inputText value="#{MBDadosObra.obraBean.termo_aditivo}"
required="true" label="Termo Aditivo (TA)" />
<h:outputLabel value="Gerência: " />
<h:inputText value="#{MBDadosObra.obraBean.gerencia}"
required="true" label="Programa" />
<h:outputLabel value="Data de Assinatura do TA: " />
<h:inputText value="#{MBDadosObra.obraBean.data_de_ass_ta}"
required="true" label="Vigencia do TA" />
<h:outputLabel value="Vigência TA: " />
<h:inputText value="#{MBDadosObra.obraBean.vigencia_do_ta}"
required="true" label="Data TA" />
<h:outputLabel value="Gerente: " />
<h:inputText value="#{MBDadosObra.obraBean.gerente}"
required="true" label="Gerente:" />
<h:outputLabel value="Recurso: " />
<h:inputText value="#{MBDadosObra.obraBean.recurso}"
required="true" label="Recurso" />
<h:outputLabel value="Codigo Contabil: " />
<h:inputText value="#{MBDadosObra.obraBean.cod_contabil}"
required="true" label="Codigo Contabil" />
<h:outputLabel value="Engenheiro Responsável: " />
<h:inputText value="#{MBDadosObra.obraBean.engenheiro}"
required="true" label="Engenheiro Responsável:" />
<h:outputLabel value="Programa: " />
<h:inputText value="#{MBDadosObra.obraBean.programa}"
required="true" label="Programa" />
<h:outputLabel value="Localidade: " />
<h:inputText value="#{MBDadosObra.obraBean.localidade}"
required="true" label="Localidade" />
<h:outputLabel value="Técnico Responsável: " />
<h:inputText value="#{MBDadosObra.obraBean.tecnico}"
required="true" label="Técnico Responsável:" />
<h:outputLabel value="Regional Pertencente: " />
<h:inputText value="#{MBDadosObra.obraBean.regional}"
required="true" label="Regional Pertencente:" />
<h:outputLabel value="Nº RT: " />
<h:inputText value="#{MBDadosObra.obraBean.rt}" required="true"
label="Nº RT:" />
<h:outputLabel value="Data: " />
<h:inputText value="#{MBDadosObra.obraBean.data}" required="true"
label="Data:" />
<p:commandButton value="Salvar Obra" action="#{MBDadosObra.novo}"
update="growl" process="@this" />
</h:panelGrid>
</h:form>
</p:panel>
</ui:define>
</ui:composition>
ele está ligado ao servidor através da classe beanObras, abaixo:
package br.com.robson.sigor2.bean;
import java.sql.SQLException;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import br.com.robson.sigor2.domain.DomainObras;
import br.com.robson.sigor2.util.JSFUtil;
import br.com.robson.sigor2.dao.DaoObra;
@ManagedBean(name = "MBDadosObra")
@SessionScoped
public class BeanObras {
private DomainObras obraBean = new DomainObras();
public DomainObras getObraBean() {
return obraBean;
}
public void setObraBean(DomainObras obraBean) {
this.obraBean = obraBean;
}
public void novo() {
try {
DaoObra dao = new DaoObra();
dao.salvar(obraBean);
JSFUtil.adicionarMenssagemSucesso("Obra Salva com Sucesso !!");
} catch (SQLException e) {
JSFUtil.adicionarMenssagemErro("ex.getMessage()");
e.printStackTrace();
}
}
}
Dentro dessa classe bean eu instanciei a classe DomainObras, onde contém as variaveis que eu quero enviar para o banco de dados, também dentro dessa classe existe o metodo “novo” que instancia a classe DaoObras, e dentro dessa classe DaoObras está o metodo que salva no banco de dados. segue abaixo também a classe DomaisObras e a classe DaoObras :
DomainObras
package br.com.robson.sigor2.domain;
public class DomainObras {
private int cod_obra;
private String municipio;
private String termo_aditivo;
private String data_de_ass_ta;
private String vigencia_do_ta;
private String cod_contabil;
private String localidade;
private int recurso;
private String programa;
private String gerencia;
private String gerente;
private String engenheiro;
private String tecnico;
private String status;
private String rt;
private String regional;
private String diagnostico;
private double metro_ligacao;
private String data;
public int getCod_obra() {
return cod_obra;
}
public void setCod_obra(int cod_obra) {
this.cod_obra = cod_obra;
}
public String getMunicipio() {
return municipio;
}
public void setMunicipio(String municipio) {
this.municipio = municipio;
}
public String getTermo_aditivo() {
return termo_aditivo;
}
public void setTermo_aditivo(String termo_aditivo) {
this.termo_aditivo = termo_aditivo;
}
public String getData_de_ass_ta() {
return data_de_ass_ta;
}
public void setData_de_ass_ta(String data_de_ass_ta) {
this.data_de_ass_ta = data_de_ass_ta;
}
public String getVigencia_do_ta() {
return vigencia_do_ta;
}
public void setVigencia_do_ta(String vigencia_do_ta) {
this.vigencia_do_ta = vigencia_do_ta;
}
public String getCod_contabil() {
return cod_contabil;
}
public void setCod_contabil(String cod_contabil) {
this.cod_contabil = cod_contabil;
}
public String getLocalidade() {
return localidade;
}
public void setLocalidade(String localidade) {
this.localidade = localidade;
}
public int getRecurso() {
return recurso;
}
public void setRecurso(int recurso) {
this.recurso = recurso;
}
public String getPrograma() {
return programa;
}
public void setPrograma(String programa) {
this.programa = programa;
}
public String getGerencia() {
return gerencia;
}
public void setGerencia(String gerencia) {
this.gerencia = gerencia;
}
public String getGerente() {
return gerente;
}
public void setGerente(String gerente) {
this.gerente = gerente;
}
public String getEngenheiro() {
return engenheiro;
}
public void setEngenheiro(String engenheiro) {
this.engenheiro = engenheiro;
}
public String getTecnico() {
return tecnico;
}
public void setTecnico(String tecnico) {
this.tecnico = tecnico;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getRt() {
return rt;
}
public void setRt(String rt) {
this.rt = rt;
}
public String getRegional() {
return regional;
}
public void setRegional(String regional) {
this.regional = regional;
}
public String getDiagnostico() {
return diagnostico;
}
public void setDiagnostico(String diagnostico) {
this.diagnostico = diagnostico;
}
public double getMetro_ligacao() {
return metro_ligacao;
}
public void setMetro_ligacao(double metro_ligacao) {
this.metro_ligacao = metro_ligacao;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
DaoObras
package br.com.robson.sigor2.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import br.com.robson.sigor2.domain.DomainObras;
import br.com.robson.sigor2.factory.ConexaoFactory;
public class DaoObra {
public void salvar(DomainObras obraDao) throws SQLException {
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO cad_dados_obras ");
sql.append("(municipio, ta, gerencia, data_ass_ta, vigencia_ta, gerente, recurso, codigo_contabil, engenheiro, programa, localidade, tecnico, status, regional, rt)");
sql.append(" VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
Connection con = ConexaoFactory.conectar();
PreparedStatement comando = con.prepareStatement(sql.toString());
/*Dados da Obra - Insere os dados do Cadastro no Banco de Dados*/
comando.setString(1, obraDao.getMunicipio());
comando.setString(2, obraDao.getTermo_aditivo());
comando.setString(3, obraDao.getGerencia());
comando.setString(4, obraDao.getData_de_ass_ta());
comando.setString(5, obraDao.getVigencia_do_ta());
comando.setString(6, obraDao.getGerente());
comando.setInt(7, obraDao.getRecurso());
comando.setString(8, obraDao.getCod_contabil());
comando.setString(9, obraDao.getEngenheiro());
comando.setString(10, obraDao.getPrograma());
comando.setString(11, obraDao.getLocalidade());
comando.setString(12, obraDao.getTecnico());
comando.setString(13, obraDao.getRegional());
comando.setString(14, obraDao.getRt());
comando.setString(15, obraDao.getData());
comando.executeUpdate();
}
public void editar (DomainObras p) throws SQLException{
StringBuilder sql = new StringBuilder();
sql.append("UPDATE cad_dados_obras ");
sql.append("SET municipio = ?, ta = ?, gerencia = ?,data_ass_ta = ?, vigencia_ta = ?, gerente = ?, recurso = ?, codigo_contabil = ?, engenheiro = ?, programa = ?, localidade = ?, tecnico = ?, status = ?, regional = ?, rt = ?");
sql.append("WHERE codDadosObra = ? ");
Connection con = ConexaoFactory.conectar();
PreparedStatement comando = con.prepareStatement(sql.toString());
comando.setString(1, p.getMunicipio());
comando.setString(2, p.getTermo_aditivo());
comando.setString(3, p.getGerencia());
comando.setString(4, p.getData_de_ass_ta());
comando.setString(5, p.getVigencia_do_ta());
comando.setString(6, p.getGerente());
comando.setInt(7, p.getRecurso());
comando.setString(8, p.getCod_contabil());
comando.setString(9, p.getEngenheiro());
comando.setString(10, p.getPrograma());
comando.setString(11, p.getLocalidade());
comando.setString(12, p.getTecnico());
comando.setString(13, p.getRegional());
comando.setString(14, p.getRt());
comando.setString(15, p.getData());
comando.executeUpdate();
}
public static void main(String[] args) {
DaoObra daoObra = new DaoObra();
try {
DomainObras obra = new DomainObras();
obra.setMunicipio("");
obra.setTermo_aditivo("6º");
obra.setGerencia("GPOSO");
obra.setData_de_ass_ta("13/09/2020");
obra.setVigencia_do_ta("13/09/2022");
obra.setGerente("Mario");
obra.setRecurso(417);
obra.setCod_contabil("B45");
obra.setEngenheiro("Aroldo");
obra.setPrograma("San Rural");
obra.setLocalidade("Linha Damasceno");
obra.setTecnico("Robson");
obra.setRegional("GRPB");
obra.setRt("20/2020");
obra.setData("13/09/2020");
daoObra.salvar(obra);
System.out.println("Salvo com sucesso !!");
} catch (SQLException e) {
System.out.println("Erro ao Salvar");
e.printStackTrace();
}
}
}
O problema é que quando eu rodo o tomcat ele me gera um erro indicando que os campos do XHTML estão nulos, o que não faz sentido, porque eu preencho todos os campos do formulario antes de acionar o botão salvar, segue a mensagem de erro :
set 13, 2020 6:18:32 PM org.apache.catalina.core.AprLifecycleListener init
INFORMAÇÕES: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre1.8.0_261\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jre1.8.0_261/bin/server;C:/Program Files/Java/jre1.8.0_261/bin;C:/Program Files/Java/jre1.8.0_261/lib/amd64;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Java\jdk1.8.0_261;C:\Users\robso\OneDrive\Área de Trabalho;;.
set 13, 2020 6:18:32 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
ADVERTÊNCIA: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:SIGOR2' did not find a matching property.
set 13, 2020 6:18:32 PM org.apache.coyote.AbstractProtocol init
INFORMAÇÕES: Initializing ProtocolHandler ["http-bio-8080"]
set 13, 2020 6:18:32 PM org.apache.coyote.AbstractProtocol init
INFORMAÇÕES: Initializing ProtocolHandler ["ajp-bio-8009"]
set 13, 2020 6:18:32 PM org.apache.catalina.startup.Catalina load
INFORMAÇÕES: Initialization processed in 734 ms
set 13, 2020 6:18:32 PM org.apache.catalina.core.StandardService startInternal
INFORMAÇÕES: Starting service Catalina
set 13, 2020 6:18:32 PM org.apache.catalina.core.StandardEngine startInternal
INFORMAÇÕES: Starting Servlet Engine: Apache Tomcat/7.0.47
set 13, 2020 6:18:33 PM org.apache.catalina.util.SessionIdGenerator createSecureRandom
INFORMAÇÕES: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [154] milliseconds.
set 13, 2020 6:18:34 PM com.sun.faces.config.ConfigureListener contextInitialized
INFORMAÇÕES: Inicializando Mojarra 2.2.9 (-SNAPSHOT 20141218-0939 https://svn.java.net/svn/mojarra~svn/tags/2.2.9@14083) para o contexto '/SIGOR2'
set 13, 2020 6:18:35 PM com.sun.faces.spi.InjectionProviderFactory createInstance
INFORMAÇÕES: JSF1048: Anotações PostConstruct/PreDestroy presentes. Os métodos ManagedBeans marcados com essas anotações informarão as anotações processadas.
set 13, 2020 6:18:36 PM org.primefaces.webapp.PostConstructApplicationEventListener processEvent
INFORMAÇÕES: Running on PrimeFaces 4.0
set 13, 2020 6:18:36 PM org.apache.coyote.AbstractProtocol start
INFORMAÇÕES: Starting ProtocolHandler ["http-bio-8080"]
set 13, 2020 6:18:36 PM org.apache.coyote.AbstractProtocol start
INFORMAÇÕES: Starting ProtocolHandler ["ajp-bio-8009"]
set 13, 2020 6:18:36 PM org.apache.catalina.startup.Catalina start
INFORMAÇÕES: Server startup in 3572 ms
Sun Sep 13 18:18:53 BRT 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'municipio' cannot be null
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.Util.getInstance(Util.java:387)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:934)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3966)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3902)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2526)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2673)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2549)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009)
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5098)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994)
at br.com.robson.sigor2.dao.DaoObra.salvar(DaoObra.java:41)
at br.com.robson.sigor2.bean.BeanObras.novo(BeanObras.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(Unknown Source)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(Unknown Source)
at com.sun.faces.application.ActionListenerImpl.processAction(Unknown Source)
at javax.faces.component.UICommand.broadcast(Unknown Source)
at javax.faces.component.UIViewRoot.broadcastEvents(Unknown Source)
at javax.faces.component.UIViewRoot.processApplication(Unknown Source)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(Unknown Source)
at com.sun.faces.lifecycle.Phase.doPhase(Unknown Source)
at com.sun.faces.lifecycle.LifecycleImpl.execute(Unknown Source)
at javax.faces.webapp.FacesServlet.service(Unknown Source)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Se alguém puder me ajudar a desvendar esse mistério eu ficaria muito agradecido, obrigado.