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 是关键。