我们有一个 spring-boot 服务,它需要在使用 flyway 进行一些数据库迁移后停止。我们通过回调和线路解决了这个问题
int exitCode = SpringApplication.exit(applicationContext, () -> 0);
System.exit(exitCode);
Run Code Online (Sandbox Code Playgroud)
到目前为止它运行良好(spring-boot 2.4.x),但最近,我们选择了 2.5.1,现在它不再停止了。这是错误还是功能?现在还有其他方法可以关闭服务吗?
编辑
我做了一个线程转储,但我不太确定如何解释它
"main" #1 prio=5 os_prio=0 tid=0x00000000027eb000 nid=0x1280 in Object.wait() [0x000000000276d000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000006c29756c8> (a java.lang.Thread)
at java.lang.Thread.join(Thread.java:1252)
- locked <0x00000006c29756c8> (a java.lang.Thread)
at java.lang.Thread.join(Thread.java:1326)
at java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:107)
at java.lang.ApplicationShutdownHooks$1.run(ApplicationShutdownHooks.java:46)
at java.lang.Shutdown.runHooks(Shutdown.java:123)
at java.lang.Shutdown.sequence(Shutdown.java:170)
at java.lang.Shutdown.exit(Shutdown.java:216)
- locked <0x00000006c28bc680> (a java.lang.Class for java.lang.Shutdown)
at java.lang.Runtime.exit(Runtime.java:109)
at java.lang.System.exit(System.java:973)
at com.whatsoever.glp.moneypenny.config.PostMigrationCallback.supports(PostMigrationCallback.java:44)
at org.flywaydb.core.internal.callback.DefaultCallbackExecutor.execute(DefaultCallbackExecutor.java:115)
at org.flywaydb.core.internal.callback.DefaultCallbackExecutor.onMigrateOrUndoEvent(DefaultCallbackExecutor.java:73)
at org.flywaydb.core.internal.command.DbMigrate.migrate(DbMigrate.java:165)
at …Run Code Online (Sandbox Code Playgroud) 编辑:最初我打算使用AutoMapper来实现我的目标,但我必须了解到AutoMapper并非旨在以这种方式工作。它使您可以创建配置文件,但就我而言(完全可配置),对于每种参数组合,我都需要一个配置文件,因此我想出了一种自己的方法,请参见答案。
从AutoMapper Wiki,我学会了创建一个简单的映射,例如
Mapper.CreateMap<CalendarEvent, CalendarEventForm>().ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Title));
Mapper.CreateMap<CalendarEvent, CalendarEventForm>().ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.EventDate.Date));
Mapper.CreateMap<CalendarEvent, CalendarEventForm>().ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.EventDate.Hour));
Mapper.CreateMap<CalendarEvent, CalendarEventForm>().ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.EventDate.Minute));
Run Code Online (Sandbox Code Playgroud)
对于两个类
public class CalendarEvent
{
public DateTime EventDate;
public string Title;
}
public class CalendarEventForm
{
public DateTime EventDate { get; set; }
public int EventHour { get; set; }
public int EventMinute { get; set; }
public string Title …Run Code Online (Sandbox Code Playgroud) 我最近覆盖了equals我最近的Java项目的域对象中的一些方法.当我们使用Sonar计算我们的代码度量时,我立即看到这些类的圈复杂度增加到阈值以上.
我想知道是否有一种聪明的方式,模式或选项可以保持这个指标低,尽管有一些更复杂的equals方法.
编辑:这是我的一个例子,我没有具体说明,只是为了让我们知道我们在谈论什么.
@Override
public boolean equals(Object o) {
if (o instanceof MyKey) {
MyKey other = (MyKey) o;
if (this.foo.longValue() == other.getFoo().longValue() &&
this.bar.equalsIgnoreCase(other.getBar()) &&
this.foobar.shortValue() == other.getFoobar().longValue()){
return true;
}
}
return false;
}
@Override
public int hashCode() {
int hash = 3;
hash = 53 * hash + foo.hashCode();
hash = 53 * hash + bar.hashCode();
hash = 53 * hash + foobar.hashCode();
return hash;
}
Run Code Online (Sandbox Code Playgroud) 我们最近从 Spring Boot 2.1.9 升级到 2.2.1,这导致我们的测试失败。调查导致该java.time.Duration类型现在默认以不同方式序列化。"PT15M"我们现在得到 JSON 消息中的字符串,而不是"900.0". POJO 定义看起来像这样
@JsonProperty(required = true, value = "duration")
@NotNull
private final Duration duration;
Run Code Online (Sandbox Code Playgroud)
现在的问题是,是否有一些配置属性可以用来获取“旧”行为。我知道我们也可以添加注释
@JsonFormat(shape = JsonFormat.Shape.STRING)
Run Code Online (Sandbox Code Playgroud)
但我更喜欢通过配置来获得它的方法。
我们最近将我们的一项服务升级到了 2.3.4.RELEASE。更新后,我们无法再连接到 Azure PAAS PostgreSQL,我们收到 无法从数据库 (jdbc:postgresql://postgisdb:5432/someDb) 获取用户“someUser@someDB”的连接:连接尝试失败 我们看到 PostgreSQL 依赖从 4.2.14 更新到 4.2.16。切换回 4.2.14 使问题消失,但是,我想知道为什么它在当前版本上失败。
java ×4
spring-boot ×3
automapper ×1
c# ×1
equals ×1
flyway ×1
jackson ×1
mapping ×1
overriding ×1
postgresql ×1
reflection ×1