Dados de bootstrapping com Spring

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.groovye comece a criar novas entidades.

Felizmente, podemos criar um mecanismo semelhante usando um InitializingBeane 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 @Serviceanotaçã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