maven spring-boot:运行 "No primary or single public constructor found...TemplateLineItemInput" 但只能从命令行?
mvn spring-boot:run "No primary or single public constructor found...TemplateLineItemInput" but only from commandline?
我有一个中间 Spring Boot + Lombok 项目,它像 IDE 中的冠军一样工作,但是当我从命令中 运行 它时出现奇怪的错误通过 mvn spring-boot:run
行。这是一个相当新的版本 Spring Boot...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Lombok 很普通,来自 Spring Initializr 东西 (https://start.spring.io/)。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
它吐槽的JavaBean同样无聊...
import lombok.Builder;
import lombok.Data;
import java.math.BigDecimal;
@Data
@Builder(toBuilder = true)
public class TemplateLineItemInput {
private final String partMasterId;
private final String partMasterIdPath;
private final String actionType;
private final BigDecimal actionQuantity;
}
这个 Boot 项目的 API 是 GraphQL,但是当我从 mvn spring-boot:run
调用执行以下突变时,它总是作为错误返回(控制台上没有任何内容......框架是以某种方式将其踢出)。
Request...
mutation createTemplateLineItem($tbomId: ID!) {
createTemplateLineItem(
tbomId: $tbomId
input: {
partMasterId: "2"
partMasterIdPath: "808863036.1"
actionType: "ADD"
actionQuantity: "2"
}) {
...TBomFrag
}
}
...
{
"partMasterId": "5025489768",
"tbomId": "a4688d22-9d99-41a2-9777-6acc75b2aab9",
"lineItemId": "9e460199-34fb-432c-b971-8cd8321d3283"
}
Response...
{
"errors": [
{
"message": "No primary or single public constructor found for class aero.blue.ems.boa.domain.TemplateLineItemInput - and no default constructor found either",
"locations": [
{
"line": 20,
"column": 3
}
],
"path": [
"createTemplateLineItem"
],
"extensions": {
"classification": "INTERNAL_ERROR"
}
}
],
"data": {
"createTemplateLineItem": null
}
}
我的 spring-boot-maven-plugin
配置如下...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.4</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
...也来自 Spring Initializr
当我直接从 IDE 运行 应用程序时,没问题。突变工作正常。
我的 spring-boot:运行 配置中的 pom.xml 中是否缺少某些东西?我是否必须让插件进入注释处理?这真是令人困惑。
拜托,
检查您 pom.xml 项目部分插件的以下配置,如下所示:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>getting-started</artifactId>
<!-- ... -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
有关更多信息,请查看此 link:https://docs.spring.io/spring-boot/docs/2.5.4/maven-plugin/reference/htmlsingle/
最终这归结为我的 bean 的 Lombok 配置错误。解决方法是将 @AllArgsConstructor
添加到 bean 定义
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import java.math.BigDecimal;
@Data
@Builder(toBuilder = true)
@AllArgsConstructor
public class TemplateLineItemInput {
private final String partMasterId;
private final String partMasterIdPath;
private final String actionType;
private final BigDecimal actionQuantity;
}
我们如何解决这个问题的是“Delombok”Bean 并查看生成的代码。此观察结果与错误消息相符;没有 public 构造函数。
...
TemplateLineItemInput(String partMasterId, String partMasterIdPath, String actionType, BigDecimal actionQuantity) {
this.partMasterId = partMasterId;
this.partMasterIdPath = partMasterIdPath;
this.actionType = actionType;
this.actionQuantity = actionQuantity;
}
不知何故(我仍然不完全明白为什么),@Builder(toBuilder=true)
注释让 Lombok 生成了一个包私有构造函数。杰克逊需要一些东西 public。
添加 @AllArgsConstructor
注释使该构造函数 public 一切正常。
public TemplateLineItemInput(String partMasterId, String partMasterIdPath, String actionType, BigDecimal actionQuantity) {
this.partMasterId = partMasterId;
this.partMasterIdPath = partMasterIdPath;
this.actionType = actionType;
this.actionQuantity = actionQuantity;
}
Delombok 是关键。
我有一个中间 Spring Boot + Lombok 项目,它像 IDE 中的冠军一样工作,但是当我从命令中 运行 它时出现奇怪的错误通过 mvn spring-boot:run
行。这是一个相当新的版本 Spring Boot...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Lombok 很普通,来自 Spring Initializr 东西 (https://start.spring.io/)。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
它吐槽的JavaBean同样无聊...
import lombok.Builder;
import lombok.Data;
import java.math.BigDecimal;
@Data
@Builder(toBuilder = true)
public class TemplateLineItemInput {
private final String partMasterId;
private final String partMasterIdPath;
private final String actionType;
private final BigDecimal actionQuantity;
}
这个 Boot 项目的 API 是 GraphQL,但是当我从 mvn spring-boot:run
调用执行以下突变时,它总是作为错误返回(控制台上没有任何内容......框架是以某种方式将其踢出)。
Request...
mutation createTemplateLineItem($tbomId: ID!) {
createTemplateLineItem(
tbomId: $tbomId
input: {
partMasterId: "2"
partMasterIdPath: "808863036.1"
actionType: "ADD"
actionQuantity: "2"
}) {
...TBomFrag
}
}
...
{
"partMasterId": "5025489768",
"tbomId": "a4688d22-9d99-41a2-9777-6acc75b2aab9",
"lineItemId": "9e460199-34fb-432c-b971-8cd8321d3283"
}
Response...
{
"errors": [
{
"message": "No primary or single public constructor found for class aero.blue.ems.boa.domain.TemplateLineItemInput - and no default constructor found either",
"locations": [
{
"line": 20,
"column": 3
}
],
"path": [
"createTemplateLineItem"
],
"extensions": {
"classification": "INTERNAL_ERROR"
}
}
],
"data": {
"createTemplateLineItem": null
}
}
我的 spring-boot-maven-plugin
配置如下...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.4</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
...也来自 Spring Initializr
当我直接从 IDE 运行 应用程序时,没问题。突变工作正常。
我的 spring-boot:运行 配置中的 pom.xml 中是否缺少某些东西?我是否必须让插件进入注释处理?这真是令人困惑。
拜托,
检查您 pom.xml 项目部分插件的以下配置,如下所示:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>getting-started</artifactId>
<!-- ... -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
有关更多信息,请查看此 link:https://docs.spring.io/spring-boot/docs/2.5.4/maven-plugin/reference/htmlsingle/
最终这归结为我的 bean 的 Lombok 配置错误。解决方法是将 @AllArgsConstructor
添加到 bean 定义
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import java.math.BigDecimal;
@Data
@Builder(toBuilder = true)
@AllArgsConstructor
public class TemplateLineItemInput {
private final String partMasterId;
private final String partMasterIdPath;
private final String actionType;
private final BigDecimal actionQuantity;
}
我们如何解决这个问题的是“Delombok”Bean 并查看生成的代码。此观察结果与错误消息相符;没有 public 构造函数。
...
TemplateLineItemInput(String partMasterId, String partMasterIdPath, String actionType, BigDecimal actionQuantity) {
this.partMasterId = partMasterId;
this.partMasterIdPath = partMasterIdPath;
this.actionType = actionType;
this.actionQuantity = actionQuantity;
}
不知何故(我仍然不完全明白为什么),@Builder(toBuilder=true)
注释让 Lombok 生成了一个包私有构造函数。杰克逊需要一些东西 public。
添加 @AllArgsConstructor
注释使该构造函数 public 一切正常。
public TemplateLineItemInput(String partMasterId, String partMasterIdPath, String actionType, BigDecimal actionQuantity) {
this.partMasterId = partMasterId;
this.partMasterIdPath = partMasterIdPath;
this.actionType = actionType;
this.actionQuantity = actionQuantity;
}
Delombok 是关键。