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

Erro em ManyToOne, com campo null

Relacionamento do erro

    @ManyToOne
    @JoinColumn(name = "tit_id", nullable = false)
    public TituloEntity getTituloEntidadeHistorico() {
            return tituloEntidadeHistorico;
    }

Não entendi este erro

 20:20:42.306 [http-nio-8080-exec-39] ERROR org.thymeleaf.TemplateEngine - [THYMELEAF][http-nio-8080-exec-39] Exception processing template "historicoEmpresa/index": Exception evaluating SpringEL expression: "historicoEmpresa.tituloEntidadeHistorico.descricao" (template: "historicoEmpresa/index" - line 39, col 8)
org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "historicoEmpresa.tituloEntidadeHistorico.descricao" (template: "historicoEmpresa/index" - line 39, col 8)
    at org.thymeleaf.spring4.expression.SPELVariableExpressionEvaluator.evaluate(SPELVariableExpressionEvaluator.java:290) ~[thymeleaf-spring4-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.standard.expression.VariableExpression.executeVariableExpression(VariableExpression.java:165) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:66) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.standard.expression.Expression.execute(Expression.java:109) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.standard.expression.Expression.execute(Expression.java:138) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.standard.expression.Expression.execute(Expression.java:125) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
7 respostas

Continuação


    at org.thymeleaf.standard.processor.AbstractStandardExpressionAttributeTagProcessor.doProcess(AbstractStandardExpressionAttributeTagProcessor.java:82) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.engine.ProcessorTemplateHandler.handleOpenElement(ProcessorTemplateHandler.java:1304) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.engine.OpenElementTag.beHandled(OpenElementTag.java:205) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.engine.Model.process(Model.java:282) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.engine.Model.process(Model.java:290) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.engine.IteratedGatheringModelProcessable.processIteration(IteratedGatheringModelProcessable.java:333) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.engine.IteratedGatheringModelProcessable.process(IteratedGatheringModelProcessable.java:197) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.engine.ProcessorTemplateHandler.handleCloseElement(ProcessorTemplateHandler.java:1620) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.engine.CloseElementTag.beHandled(CloseElementTag.java:139) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.engine.TemplateModel.process(TemplateModel.java:136) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:662) ~[thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1087) [thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1061) [thymeleaf-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:335) [thymeleaf-spring4-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.thymeleaf.spring4.view.ThymeleafView.render(ThymeleafView.java:189) [thymeleaf-spring4-3.0.0.RELEASE.jar:3.0.0.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1257) [spring-webmvc-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037) [spring-webmvc-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) [spring-webmvc-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) [spring-webmvc-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) [servlet-api.jar:?]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [servlet-api.jar:?]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:8.5.20]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.20]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.0.RELEASE.jar:4.3.0.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.0.RELEASE.jar:4.3.0.RELEASE]

Opa, acho que ainda falta pedaço da exception :). O relacionamento realmente não pode ser nulo, a não ser que você marque como optional=true.

Fiz assim:

@ManyToOne(optional = true)
@JoinColumn(name = "tit_id")
public TituloEntity getTituloEntidadeHistorico() {
    return tituloEntidadeHistorico;
}

public void setTituloEntidadeHistorico(TituloEntity tituloEntidadeHistorico) {
    this.tituloEntidadeHistorico = tituloEntidadeHistorico;
}

Não funcionou, Log completo:

https://gist.github.com/guilhermecostalopes/acaa029014621e85a3751e9cd21582e9

O erro aponta para algo diferente mesmo... diz que você tentou buscar a propriedade descricao, so que o tituloEntidadeHistorico ta nulo. Acho que você vai precisar fazer um if.

Só que existem registros null na tabela.

Entidade

    package br.com.netsoft.desif.model.desif.federal;

    import java.util.Date;

    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.SequenceGenerator;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    import javax.persistence.Transient;

    import br.com.netsoft.desif.model.DesIfEntity;
    import br.com.netsoft.desif.util.DataUtil;
    import br.com.netsoft.desif.util.DesIfUtil;

    /**
     * Anexo 2 - Tabela de Titulos
     */
    @Entity
    @Table(name = "des_titulos", schema = "des_if_federal")
    public class TituloEntity extends DesIfEntity {

        private static final long serialVersionUID = 3141584130491086896L;
        private Long id;
        private String codigo;
        private String descricao;
        private boolean obrigatorio;
        private boolean uso;
        private Date vigenciaDe;
        private Date vigenciaAte;

        @Id
        @Column(name = "tit_id")
        @SequenceGenerator(name = "des_if_federal.des_titulos_tit_id_seq", sequenceName = "des_titulos_tit_id_seq", allocationSize = 1)
        @GeneratedValue(generator = "des_if_federal.des_titulos_tit_id_seq", strategy = GenerationType.SEQUENCE)
        public Long getId() {
            return id;
        }

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

        @Column(name = "tit_codigo")
        public String getCodigo() {
            return codigo;
        }

        public void setCodigo(String codigo) {
            this.codigo = codigo;
        }

        @Column(name = "tit_descricao")
        public String getDescricao() {
            return descricao;
        }

        public void setDescricao(String descricao) {
            this.descricao = descricao;
        }

        @Column(name = "tit_obrigatorio")
        public boolean isObrigatorio() {
            return obrigatorio;
        }

        public void setObrigatorio(boolean obrigatorio) {
            this.obrigatorio = obrigatorio;
        }

        @Column(name = "tit_uso")
        public boolean isUso() {
            return uso;
        }

        public void setUso(boolean uso) {
            this.uso = uso;
        }

        @Column(name = "tit_vigencia_de")
        @Temporal(TemporalType.TIMESTAMP)
        public Date getVigenciaDe() {
            if (this.vigenciaDe == null) {
                return null;
            }
            return (Date) vigenciaDe.clone();
        }

        public void setVigenciaDe(Date vigenciaDe) {
            if (vigenciaDe == null) {
                this.vigenciaDe = null;
            } else {
                this.vigenciaDe = (Date) vigenciaDe.clone();
            }
        }

        @Column(name = "tit_vigencia_ate")
        @Temporal(TemporalType.TIMESTAMP)
        public Date getVigenciaAte() {
            return vigenciaAte;
        }

        public void setVigenciaAte(Date vigenciaAte) {
            this.vigenciaAte = vigenciaAte;
        }

        @Transient
        public String getObrigatorioFormatado() {
            return DesIfUtil.formataSimNao(obrigatorio, 1);
        }

        @Transient
        public String getUsoFormatado() {
            return DesIfUtil.formataSimNao(uso, 1);
        }

        @Transient
        public String getInicioVigenciaFormatado() {
            return DataUtil.formataData(vigenciaDe, "N");
        }

        @Transient
        public String getFimVigenciaFormatado() {
            return DataUtil.formataData(vigenciaAte, "N");
        }
    }

Acho que não vai ter jeito. Precisa fazer o if.

solução!

OK.

Na verdade pensando aqui, eu não preciso deste relacionamento. Posso alterar para um string. Assim gravo a descrição, pois esta tabela é de LOG.