Я обновляю свое приложение с 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> {
}