Primavera Nuvem configuração do servidor + JBoss Application Server JNDI (MySql) + Primavera de dados JPA com Hibernate com atualização DataSource

votos
0

Desde o título dado, eu tenho uma amostra de trabalhar sem os dados Parte Primavera usando uma fonte de dados simples e modelo JDBC com a atualização de fonte de dados em bater onda para atualizar o feijão fonte de dados também. Mas não podia fazê-lo funcionar com a Primavera de dados JPA depois de passar incontáveis horas de pesquisa e navegação diferentes posts como primavera-persistence-jpa-jndi-datasource , primavera-boot-jndi-datasource

Vou explicar os passos completos e também irá ligar o projeto git de trabalhar exemplo de modelo JDBC e projeto JPA abaixo também. Todos os componentes são criados localmente para demonstração.


Adicionando fonte de dados mysql para JNDI JBoss Application Server (10.1.10 final)

Graças ao vídeo abaixo - 3 maneiras como adicionar uma fonte de dados para JBoss Application Server 9 , adicionei dois MySql Datasources apontando para duas bases de dados diferentes no meu servidor mysql local através da implantação do frasco conector mysql e adicionando fonte de dados usando o console JBoss Application Server e testar ambos da consola foi bem sucedida .

Configuração de servidor e cliente

Ambos estes são configurados de forma adequada e testado como bem. Clientes de configuração jdbcConfigClient e jpaConfigClient ler a propriedade consulta JNDI do servidor de configuração remota. MysqlConnector jar, ConfigClient e ConfigServer são implantados no JBoss Application Server local usando JBoss Application Server Console (Apenas um cliente implantado para teste).

JdbcClient

Aqui está um trecho da configuração de fonte de dados juntamente com o principal controlador applicaton e amostra para testar atualização fonte de dados -

    @SpringBootApplication
    @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
    @RefreshScope
    public class ConfigclientApplication extends SpringBootServletInitializer      {

    public static void main(String[] args) {
        SpringApplication.run(ConfigclientApplication.class, args);
    }
}

@RefreshScope
@RestController
class MessageRestController {

@Autowired
SampleDao dao;

@Value(${message:Hello default})
private String message;

@RequestMapping(/message)
public String getMessage() {
    return this.message;
}

@RequestMapping(/person)
public List<SampleEntity> getAll() {
    return dao.findAll();
}

}

@RefreshScope
@Configuration
class DataSourceConfig {


@Value(${jndi.datasource.name})
private String jndiName;

//@RequestMapping(/jndi)
public String getJndiName() {
    return this.jndiName;
}

@Bean
@RefreshScope
public DataSource getDataSource() throws NamingException {
    JndiDataSourceLookup jndiDataSourceLookup = new JndiDataSourceLookup();
    System.out.println(Datasource jndi is +getJndiName());
    //return (DataSource) new JndiTemplate().lookup(getJndiName());
    return jndiDataSourceLookup.getDataSource(getJndiName());
}

@Bean
@RefreshScope
public JdbcTemplate getJbdcTemplate() throws NamingException {
    return new JdbcTemplate(getDataSource());
}

Para os testes, eu bati um pedido Get on / pessoa para obter lista de pessoas e foi capaz de obter êxito a resposta com a atualização da fonte de dados bem usando o pedido onda config cliente como sugerido na Introdução centralizado de configuração . Para a verificação de projeto completo jdbcConfigClient

Cliente JPA Configuração

Aqui é quando as coisas ficaram problemático. Eu tentei um monte de coisas diferentes, mas mesmo com o parâmetro JNDI codificado, a aplicação falhou para o arranque devido a diferentes causas, como nenhum parâmetro URL encontrada, nenhuma EntityManager feijão disponível ou Hikari Config está sendo carregado e falha mesmo que eu não estou usando Hikari fonte de dados em Java fonte de dados de configuração que eu assumo inicialização Primavera tenta carregar por padrão. Tentei excluindo hikari cp a partir do arranque dados primavera, tentou excluindo fonte de dados de configuração automática usando a propriedade exlcude de @EnableAutoConfigurationna aplicação principal ainda nenhum uso. Eu estou usando a configuração JPA fonte de dados em projetos normais sem servidor JNDI e configuração. Abaixo está um trecho de configuração JPA fonte de dados com o aplicativo principal:

    SpringBootApplication
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
@EnableAutoConfiguration
@RefreshScope
public class ConfigclientApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(ConfigclientApplication.class, args);
    }
}

@RefreshScope
@RestController
class MessageRestController {

    @Autowired
    SampleDao dao;

    @Value(${message:Hello default})
    private String message;

    @RequestMapping(/message)
    public String getMessage() {
        return this.message;
    }

    @RequestMapping(/person)
    public List<SampleEntity> getAll() {
        return dao.findAll();
    }

}

@RefreshScope
@Configuration
@EnableJpaRepositories(com.example.demo.dao)
@EnableTransactionManagement
/*@EntityScan(com.example.demo.entity)
@ComponentScan(com.example.demo)*/
class DataSourceConfig {

    @Value(${jndi.datasource.name})
    private String jndiName;

    public String getJndiName() {
        return this.jndiName;
    }

    @Bean
    public DataSource getDataSource() throws NamingException {
        //JndiDataSourceLookup jndiDataSourceLookup = new JndiDataSourceLookup();
        //System.out.println(Datasource jndi is +getJndiName());
        //return (DataSource) new JndiTemplate().lookup(getJndiName());
        //return jndiDataSourceLookup.getDataSource(java:/MySqlDS);
        JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
        bean.setJndiName(getJndiName());
        bean.setProxyInterface(DataSource.class);
        bean.setLookupOnStartup(false);
        bean.afterPropertiesSet();
        return (DataSource)bean.getObject();
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() throws NamingException {

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setDataSource(getDataSource());
        factory.setPackagesToScan(com.example.demo.entity);

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.MYSQL);
        vendorAdapter.setShowSql(true);
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.afterPropertiesSet();

        //HashMap<String, Object> properties = new HashMap<>();
        //properties.put(hibernate.generate-ddl, Boolean.TRUE.toString());
        //properties.put(hibernate.hbm2ddl.auto, update);
        //properties.put(hibernate.dialect, org.hibernate.dialect.MySQL5Dialect);
        //entityManagerContainer.setJpaPropertyMap(properties);

        return factory.getObject();

    }

    @Bean
    public PlatformTransactionManager transactionManager() throws NamingException {

        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory());
        return transactionManager;
    }
}

O projeto JPA pode ser encontrado aqui - JpaConfigClient Se eu remover toda a configuração de fonte de dados completamente e apenas dar a seguinte propriedade nas propriedades Remote File -

spring.datasource.jndi-name=java:/MySqlDs

Usando a configuração automática, a configuração JPA concluída com êxito e eu posso obter os dados usando pedido carteiro mas que não é a minha obrigação e não posso atualizar fonte de dados uma vez que é autoconfigured por boot. Também as propriedades remotas arquivo chamado a-bootiful-client.properties arquivo contém apenas as seguintes propriedades:

#spring.datasource.jndi-name=java:/MySqlDs
jndi.datasource.name=java.name=java:comp/env/MySqlDs
message=Hi test

Embora a aplicação é iniciado, ele corretamente pesquisas a fonte de dados JBoss Application Server (Eu tentei nomear a fonte de dados como java:comp/env/DatasourceNametambém usando o padrão java:/DatasourceNametão bem, mas não fazer a diferença e eu tenho os mesmos problemas como relatado acima. Sinta-se livre para forquilha acima projeto.

Publicado 08/11/2018 em 06:36
fonte usuário
Em outras línguas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more