我最近通过在我的 pom.xml 中添加以下行来添加本文所述的字节码增强功能:
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<version>5.3.10.Final</version>
<executions>
<execution>
<configuration>
<enableDirtyTracking>true</enableDirtyTracking>
</configuration>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
当我尝试运行时mvn clean install
,出现以下错误:
[ERROR] Failed to execute goal org.hibernate.orm.tooling:hibernate-enhance-maven-plugin:5.3.10.Final:enhance (default) on project backend: Unable to enhance class: ExtrasBookingRequestDTO$ExtrasBookingRequestDTOBuilder.class: Failed to enhance class ExtrasBookingRequestDTO$ExtrasBookingRequestDTOBuilder: Unexpected type reference on method: 19 -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.hibernate.orm.tooling:hibernate-enhance-maven-plugin:5.3.10.Final:enhance (default) on project backend: Unable to enhance class: ExtrasBookingRequestDTO$ExtrasBookingRequestDTOBuilder.class
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call(MultiThreadedBuilder.java:185)
at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call(MultiThreadedBuilder.java:181)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: org.apache.maven.plugin.MojoExecutionException: Unable to enhance class: ExtrasBookingRequestDTO$ExtrasBookingRequestDTOBuilder.class
at org.hibernate.orm.tooling.maven.MavenEnhancePlugin.doEnhancement(MavenEnhancePlugin.java:227)
at org.hibernate.orm.tooling.maven.MavenEnhancePlugin.execute(MavenEnhancePlugin.java:152)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
... 11 more
Caused by: org.hibernate.bytecode.enhance.spi.EnhancementException: Failed to enhance class ExtrasBookingRequestDTO$ExtrasBookingRequestDTOBuilder
at org.hibernate.bytecode.enhance.internal.bytebuddy.EnhancerImpl.enhance(EnhancerImpl.java:138)
at org.hibernate.orm.tooling.maven.MavenEnhancePlugin.doEnhancement(MavenEnhancePlugin.java:222)
... 14 more
Caused by: java.lang.IllegalStateException: Unexpected type reference on method: 19
at net.bytebuddy.pool.TypePool$Default$TypeExtractor$MethodExtractor.visitTypeAnnotation(TypePool.java:8198)
at net.bytebuddy.jar.asm.ClassReader.readMethod(ClassReader.java:1213)
at net.bytebuddy.jar.asm.ClassReader.accept(ClassReader.java:679)
at net.bytebuddy.jar.asm.ClassReader.accept(ClassReader.java:391)
at net.bytebuddy.pool.TypePool$Default.parse(TypePool.java:1176)
at net.bytebuddy.pool.TypePool$Default.doDescribe(TypePool.java:1160)
at net.bytebuddy.pool.TypePool$Default$WithLazyResolution.access$401(TypePool.java:1240)
at net.bytebuddy.pool.TypePool$Default$WithLazyResolution.doResolve(TypePool.java:1338)
at net.bytebuddy.pool.TypePool$Default$WithLazyResolution$LazyTypeDescription.delegate(TypePool.java:1407)
at net.bytebuddy.description.type.TypeDescription$AbstractBase$OfSimpleType$WithDelegation.getModifiers(TypeDescription.java:8115)
at net.bytebuddy.dynamic.scaffold.InstrumentedType$Factory$Default$1.represent(InstrumentedType.java:359)
at net.bytebuddy.ByteBuddy.redefine(ByteBuddy.java:731)
at org.hibernate.bytecode.enhance.internal.bytebuddy.EnhancerImpl.lambda$enhance$0(EnhancerImpl.java:133)
at org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState.rewrite(ByteBuddyState.java:149)
at org.hibernate.bytecode.enhance.internal.bytebuddy.EnhancerImpl.enhance(EnhancerImpl.java:132)
... 15 more
从异常中我猜它与 Lombok 生成的 Builder 有关。IllegalStateException: Unexpected type reference on method: 19
不幸的是,我在互联网上找不到任何有关的信息。这是 maven 失败的类:
import lombok.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class ExtrasBookingRequestDTO {
@NotNull
private Set<@Valid BookingExtraDTO> extras;
@Size(max = 1000)
private String notice;
@NotNull
private UUID temporaryBookingId;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ExtrasBookingRequestDTO that = (ExtrasBookingRequestDTO) o;
return Objects.equals(extras, that.extras) &&
Objects.equals(notice, that.notice) &&
Objects.equals(temporaryBookingId, that.temporaryBookingId);
}
@Override
public int hashCode() {
return Objects.hash(extras, notice, temporaryBookingId);
}
}