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

Could not write JSON: failed to lazily initialize a collection of role

Estou unificando dois projetos springboot que apontavam cada um para um banco de dados em um único projeto monolítico, usando a seguinte configurações abaixo:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "oracleEntityManagerFactory",
    transactionManagerRef = "oracleTransactionManager",
    basePackages = {"br.com.nuvemapi.aprovacaoDesconto.repositories",
                    "br.com.nuvemapi.aprovacaoTransferenciaVolante.repositories",
                    "br.com.nuvemapi.aprovacoes.repositories",
                    "br.com.nuvemapi.controleAtividades.repositories",
                    "br.com.nuvemapi.core.repositories",
                    "br.com.nuvemapi.postosCredenciados.repositories",
                    "br.com.nuvemapi.seguranca.repositories",
                    "br.com.nuvemapi.acompanhamentoCompras.repositories",
                    "br.com.nuvemapi.aprovacaoCompras.repositories",
                    "br.com.nuvemapi.aprovacaoDescontoRetirada.repositories",
                    "br.com.nuvemapi.producaoTecnicos.repositories"
                   }
)
public class OracleDatasourceConfig {    

    @Primary
    @Bean(name = "oracleDataSourceProperties")
    @ConfigurationProperties("oracle.datasource")
    public DataSourceProperties oracleDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Primary
    @Bean(name = "oracleDataSource")
    public HikariDataSource oracleDataSource() {

        return oracleDataSourceProperties()
                .initializeDataSourceBuilder()
                .type(HikariDataSource.class)
                .build();                                
    }

    @Primary
    @Bean(name = "oracleEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder oracleEntityManagerFactory, 
            @Qualifier("oracleDataSource") DataSource oracleDataSource) {

        return oracleEntityManagerFactory
          .dataSource(oracleDataSource)
          .persistenceUnit("oraclePU")          
          .packages("br.com.nuvemapi.aprovacaoDesconto.entities",
                    "br.com.nuvemapi.aprovacaoTransferenciaVolante.entities",
                    "br.com.nuvemapi.aprovacoes.entities",
                    "br.com.nuvemapi.controleAtividades.entities",
                    "br.com.nuvemapi.core.entities",
                    "br.com.nuvemapi.postosCredenciados.entities",
                    "br.com.nuvemapi.seguranca.entities",
                    "br.com.nuvemapi.acompanhamentoCompras.entities",
                    "br.com.nuvemapi.aprovacaoCompras.entities",
                    "br.com.nuvemapi.aprovacaoDescontoRetirada.entities",
                    "br.com.nuvemapi.producaoTecnicos.entities")                
          .build();               
    }

    @Primary
    @Bean(name = "oracleTransactionManager")
    public PlatformTransactionManager oracleTransactionManager(
            @Qualifier("oracleEntityManagerFactory") EntityManagerFactory oracleEntityManagerFactory) {

        return new JpaTransactionManager(oracleEntityManagerFactory);
    }

}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "sqlServerEntityManagerFactory",
    transactionManagerRef = "sqlServerTransactionManager",
    basePackages = "br.com.nuvemapi.integrador.repositories")
public class SqlServerDatasourceConfig {

    @Bean(name = "sqlServerDataSourceProperties")
    @ConfigurationProperties("sqlserver.datasource")
    public DataSourceProperties sqlServerDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "sqlServerDataSource")
    public HikariDataSource sqlServerDataSource() {

        return sqlServerDataSourceProperties()
                .initializeDataSourceBuilder()
                .type(HikariDataSource.class)
                .build();            
   }

    @Bean(name = "sqlServerEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder sqlServerEntityManagerFactory, 
            @Qualifier("sqlServerDataSource") DataSource sqlServerDataSource) {

        return sqlServerEntityManagerFactory
          .dataSource(sqlServerDataSource)
          .packages("br.com.nuvemapi.integrador.entities")
          .persistenceUnit("sqlServerPU")
          .build();               
    }    

    @Bean(name = "sqlServerTransactionManager")
    public PlatformTransactionManager sqlServerTransactionManager(
            @Qualifier("sqlServerEntityManagerFactory") EntityManagerFactory sqlServerEntityManagerFactory) {

        return new JpaTransactionManager(sqlServerEntityManagerFactory);
    }
}

O projeto esta subindo sem apresentar nenhum erro, porem ao tentar cosumir um endpoint de um entitadade que possui dois mapeamento @OneToMany recebo o erro do titulo da pergunta.

4 respostas

Desculpe, não coube tudo acima, então vou responder com o erro completo apresentado pelo sistema

Could not write JSON: failed to lazily initialize a collection of role: br.com.nuvemapi.integrador.entities.DespesaEntity.auditoria, could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: br.com.nuvemapi.integrador.entities.DespesaEntity.auditoria, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->br.com.nuvemapi.integrador.entities.DespesaEntity["auditoria"])",

Segue mapeamento que esta dando erro ao retornar:

@Data
@Entity
@Table(name="[DESPESA]", schema = "[CAIXA]", catalog="[Portalwebhomologa]")
public class DespesaEntity  {

    @Id
    @Column(name = "NUMERO")
    private Long numero;

    @Column(name = "DATA")
    private Date data;

    @Column(name = "VALOR")
    private BigDecimal valor;

    @Column(name = "ID_SITUACAO")
    private Long idSituacao;

    @Column(name = "ID_TIPO_DESPESA")
    private Long idTipoDespesa;

    @Column(name = "DESCRICAO")
    private String descricao;

    @Column(name = "ID_CIDADE")
    private Long idCidade;

    @Column(name = "MOTIVO")
    private String motivo;

    @Column(name = "IDTEL_APROVADOR")
    private String idtelAprovador;

    @Column(name = "IDTEL_USUARIO")
    private String idtelUsuario;

    @Column(name = "ID_EXTRATO")
    private Long idExtrato;

    @Column(name = "ID_ITEM_CONTABIL")
    private String idItemContabil;

    @Column(name = "ID_CENTRO_CUSTO")
    private String idCentroCusto;

    @Column(name = "ID_CLASSE_VALOR")
    private String idClasseValor;

    @Column(name = "DATA_SITUACAO")
    private Date dataSituacao;

    @Column(name = "LIMITE")
    private BigDecimal limite;

    @Column(name = "ATIVO")
    private Long ativo;

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "NUMERO_DESPESA", referencedColumnName = "NUMERO", insertable = false, updatable= false)
    List<DespesaAuditoriaFinEntity> auditoria;

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "NUMERO_DESPESA", referencedColumnName = "NUMERO", insertable = false, updatable= false)
    List<DespesaAnexoEntity> anexos;
}

O que me deixa mais confuso é que o mapeamento funciona sem problemas no projeto separado.

Alguém já passou por esse problema e poderia me ajudar ?

Tenta mudar para EAGER:

@OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "NUMERO_DESPESA", referencedColumnName = "NUMERO", insertable = false, updatable= false)
    List<DespesaAuditoriaFinEntity> auditoria;

Já fiz isso, e infelizmente o mesmo ocorre porém no momento de subir a aplicação e não mais na chamada do endpoint

solução!

O mapeamento das entidades estavam erradas, depois que refiz solucionou.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software