Java 方法未定义,无论在调用RESTAPI时使用lomboks@Data
我在Maven中使用了带有RESTAPI的SpringWeb应用程序。项目编译,Tomcat服务器启动时没有问题,但当我从浏览器调用某个rest服务时,我得到一个错误,getter方法未定义,应该由Lombok生成 我用这个getter对类进行了delombok测试,看看Lombok是否正确地生成了getter,它确实生成了getter,getter在那里,但是当restapi调用调用该方法时,我得到了异常 龙目岛教育班:Java 方法未定义,无论在调用RESTAPI时使用lomboks@Data,java,spring,maven,lombok,Java,Spring,Maven,Lombok,我在Maven中使用了带有RESTAPI的SpringWeb应用程序。项目编译,Tomcat服务器启动时没有问题,但当我从浏览器调用某个rest服务时,我得到一个错误,getter方法未定义,应该由Lombok生成 我用这个getter对类进行了delombok测试,看看Lombok是否正确地生成了getter,它确实生成了getter,getter在那里,但是当restapi调用调用该方法时,我得到了异常 龙目岛教育班: @XmlRootElement @Data @AllArgsConstr
@XmlRootElement
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table
public class HeroEntity
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Version
private int version;
@Column
private String name;
@ManyToMany(mappedBy = "heroes")
private List<ComicBookEntity> comicBooks;
}
在调用heroEntity.getId()
时,在add方法中引发异常。这个getter应该由Lombok生成,就像我对类进行delombok一样,一切都很好,但是我仍然得到一个异常
pom.xml:
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.18.0.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
</execution>
</executions>
</plugin>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
org.projectlombok
lombok maven插件
1.18.0.0
生成源
德隆博克
org.projectlombok
龙目
1.16.20
假如
AFAIK Lombok仅在编译阶段有效(即生成方法等)。其所有批注都有一个保留策略“源”。一旦lombok完成方法生成,就不可能在运行时“区分”原生方法和lombok生成的方法
另一方面,其他注释(这里是JPA、JAXB)在运行时得到处理,所以它们不会干扰或其他什么
所以我假设,如果JVM在运行时抱怨该方法不存在,那么它确实不存在
现在,如果在运行时该方法不存在,那么它可能确实不存在:)
真正的问题是Lombok根本不起作用,还是它生成了JPA/Hibernate不认为有效的方法
如何检查这个
我建议只打开您的war文件(同样,我隐式地假设您在tomcat中有一个war文件),在WEB-INF/lib/一个jar.jar
中找到heronentity.class
,并通过某种反汇编程序运行它,比如JAD或javap,看看生成了什么。
如果您看到有一些getter,那么它的返回类型可能与Hibernate的预期不匹配(Long vs Long,等等)
或者,如果根本没有任何getter,那么Lombok不起作用,您应该检查您的构建
我知道这更多的是猜测,而不是真实准确的答案,但这里似乎没有足够的信息,不是因为问题不好或什么的,但是,因为在你的项目中可能有更多的配置会影响答案。有什么例外?@GauravSrivastav方法未定义。非常感谢你的答案!我检查了HeroEntity.class,没有Lombok生成的代码,因此没有getter。我不知道为什么会这样,因为正如我所说,在代码的delomboked版本中,所有应该由lombok生成的方法都存在。哦,对不起,你说
WEB-INF/lib
,我检查了WEB-INF/classes
中的.class
文件。你所说的libs.jar的是什么意思?在lib
文件夹中,我得到了依赖项JAR,我应该在反汇编程序中运行哪个?我只是指运行Tomcat的JVM实际加载的类文件。从技术上讲,如果此源文件位于带有打包war的模块中,它可以位于WEB-INF/classes/heronentity.class中,或者,如果您将其保存在另一个模块(多模块项目)中,它将创建jar,并将其与WEB-INF/lib/your-jar.jar中的第三方依赖项放在一起,在其中您将找到heronentity.class,如果没有lombok生成的代码,这意味着在构建过程中lombok没有运行它的魔力,因此问题在于构建:)
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.18.0.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
</execution>
</executions>
</plugin>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>