@PostConstruct заполняет БД при запуске - обновление Spring Boot 2.2.4 - PullRequest
2 голосов
/ 06 марта 2020

Я обновляю свое приложение с Spring Boot 1.5 до 2.2. Теперь мои базы данных не работают.

В моем случае виновник, похоже, HibernateTransactionManager, когда этот метод my @PostConstruct или @EventListener(ApplicationReadyEvent.class) не сохраняется в БД, даже если код это работает. При удалении компонента transactionManager код @PostConstruct работает нормально. Но у меня есть другой код, который зависит от этого bean-компонента в моем проекте, поэтому он мне нужен.

Кроме того, если я делаю этот код в качестве конечной точки отдыха и запускаю его вручную, он всегда работает.

@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
    return new HibernateTransactionManager(emf.unwrap(SessionFactory.class));
}
@EventListener(ApplicationReadyEvent.class)
public void initDateRanges(){
    // Check if date ranges already present
    if (!jsonBucketRepo.findById(DateRangeDto.ID).isPresent()) {
        List<DateRangeDto> dateRangeDtoList = new ArrayList<>(5);
        dateRangeDtoList.add(new DateRangeDto("TODAY", "moment().startOf('day').format(dateFormat)", "moment().endOf('day').format(dateFormat)"));
        dateRangeDtoList.add(new DateRangeDto("YESTERDAY", "moment().subtract(1, 'days').startOf('day').format(dateFormat)", "moment().subtract(1, 'days').endOf('day').format(dateFormat)"));
        dateRangeDtoList.add(new DateRangeDto("THIS_WEEK", "moment().startOf('isoweek').format(dateFormat)", "moment().endOf('isoweek').format(dateFormat)"));
        dateRangeDtoList.add(new DateRangeDto("THIS_MONTH", "moment().startOf('month').format(dateFormat)", "moment().endOf('month').format(dateFormat)"));
        dateRangeDtoList.add(new DateRangeDto("LAST_MONTH", "moment().subtract(1, 'months').startOf('month').format(dateFormat)", "moment().subtract(1, 'months').endOf('month').format(dateFormat)"));
        JsonBucket rangeJson = DateRangeDto.dtoList2NewJsonBucket(dateRangeDtoList);
        JsonBucket bucket = jsonBucketRepo.save(rangeJson);
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonPropertyOrder({"nameOfRange", "fromMomentSyntax", "toMomentSyntax"})
public class DateRangeDto {

    public static final String ID = "daterange";
    public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().findAndRegisterModules();

    private String nameOfRange;
    private String fromMomentSyntax;
    private String toMomentSyntax;

    public static List<DateRangeDto> jsonBucket2DtoList(JsonBucket result) throws IOException {
        if(!result.id.equals(DateRangeDto.ID)){
            throw new IllegalArgumentException(String.format("JsonBucket has to have ID '%s'", DateRangeDto.ID));
        }
        ObjectReader reader = DateRangeDto.OBJECT_MAPPER.readerFor(new TypeReference<List<DateRangeDto>>() {});
        List<DateRangeDto> list = reader.readValue(result.getJsonNode());
        return list;
    }

    public static JsonBucket dtoList2NewJsonBucket(List<DateRangeDto> rangeDtoList) {
        JsonNode jsonNode = DateRangeDto.OBJECT_MAPPER.valueToTree(rangeDtoList);
        JsonBucket jsonBucket = new JsonBucket(DateRangeDto.ID);
        jsonBucket.setJsonNode(jsonNode);
        return jsonBucket;
    }

    public static JsonNode dtoList2JsonNode(List<DateRangeDto> rangeDtoList) {
        return DateRangeDto.OBJECT_MAPPER.valueToTree(rangeDtoList);
    }
}
@Entity
@Table(name = "tt_json_bucket")
@Data
@NoArgsConstructor
@TypeDef(
        name = "json-node",
        typeClass = JsonNodeStringType.class
)
public class JsonBucket {

    @Id
    String id;

    @Version
    Integer version;

    @Type(type = "json-node")
    @Column(columnDefinition = "VARCHAR(2000)")
    JsonNode jsonNode;

    public JsonBucket(String id) {
        this.id = id;
    }
}
@Repository
public interface JsonBucketRepository extends CrudRepository<JsonBucket, String> {

}
...