Então você está trabalhando em um projeto Java Spring ‘tradicional’ e precisa de alguns dados de referência pré-preenchidos em seu banco de dados.
No Grails, isso é muito fácil – apenas abra bootstrap.groovy
e comece a criar novas entidades.
Felizmente, podemos criar um mecanismo semelhante usando um InitializingBean
e um pouco de verificação pré-condicional.
Bean Class
Em nosso aplicativo de exemplo, precisamos de um usuário do sistema e vários códigos de país adicionados ao nosso banco de dados. Isso sempre pode ser expandido para ler listas de arquivos xml / csv, mas mantendo as coisas simples para este exemplo.
Cada função individual é responsável por verificar se seus dados precisam ser inicializados, ou se sempre foi.
@Service
public class BootstrapDataPopulator implements InitializingBean {
private final Logger LOG = LoggerFactory.getLogger(BootstrapDataPopulator.class);
@Autowired
UserRepository userRepository;
@Autowired
CountryCodeRepository countryCodeRepository;
@Override
@Transactional()
public void afterPropertiesSet() throws Exception {
LOG.info("Bootstrapping data...");
createSystemUser();
createCountryCodes();
LOG.info("...Bootstrapping completed");
}
private void createSystemUser() {
if (userRepository.getSystemUser() != null) {
return;
}
LOG.info("... creating system user");
User user = new User();
user.setUsername(userRepository.getSystemUsername());
user.setFirstName("System");
user.setLastName("User");
userRepository.saveAndFlush(user);
}
private void createCountryCodes() {
if (countryCodeRepository.count() > 0) {
return;
}
LOG.info("... creating Country codes");
List<CountryCode> codes = new ArrayList<>();
codes.add(new CountryCode(1, "AU", "Australia"));
codes.add(new CountryCode(2, "USA", "United States of America"));
codes.add(new CountryCode(3, "NZ", "New Zealand"));
countryCodeRepository.save(codes);
countryCodeRepository.flush();
}
}
Declaração de feijão
No exemplo acima, estamos usando a @Service
anotação para inicializar o bean, mas não há razão para que você não possa declarar o bean bootstrap mais explicitamente.
Logs para logs de registro
A vantagem do tipo de padrão de ‘função individual’ é que você vê facilmente quais partes do processo de bootstrap estão ocorrendo
Por exemplo, na primeira execução:
Bootstrapping data...
... creating system user
... creating Country codes
...Bootstrapping completed
E execuções subsequentes:
Bootstrapping data...
...Bootstrapping completed