当前位置: 首页 > 知识库问答 >
问题:

Lombok项目的Spring数据Rest问题

太叔志尚
2023-03-14

在Lombok中使用Spring数据Rest是否存在任何已知问题?

我有一个Spring Boot项目与Spring Data JPA,Spring Data REST,MySql连接器和Project Lombok作为依赖项。

如果我定义一个简单的实体(具有名称和描述字段):

@Entity
@Table(name = "Devicetype")
@Data
@NoArgsConstructor
public class DeviceType {

    /** Unique Entity Id */
    @Id
    @GeneratedValue
    private long uid;

    /** DeviceType name */
    private String name;

    /** DeviceType description */
    private String description;

}

然后构建和运行服务,我可以用curl命令调用它来创建(POST)一个新实体:

 curl -d "{ \"name\":\<TYPE NAME>\", \"description\":\"<TYPE DESC>\" }" -H "Content-Type: application/json" -X POST http://localhost:8082/deviceTypes | jq
 

正确返回json资源:

{
  "name": "<TYPE NAME>",
  "description": "<TYPE DESC>",
  "_links": {
    "self": {
      "href": "http://localhost:8082/deviceTypes/22"
    },
    "deviceType": {
      "href": "http://localhost:8082/deviceTypes/22"
    }
  }
}

如果添加@RestRepository注释以更改endpoint名称:

@Entity
@Table(name = "Devicetype")
@Data
@NoArgsConstructor
@RestResource(path = "types", rel = "types")
public class DeviceType {
    .
    .
    .
}

然后,POST不会将这两个字段添加到生成的实体中

curl -d "{ \"name\":\"<TYPE NAME>\", \"description\":\"<TYPE DESC>\" }" -H "Content-Type: application/json" -X POST http://localhost:8082/deviceTypes | jq
     

    {
      "_links": {
        "self": {
          "href": "http://localhost:8082/types/22"
        },
        "types": {
          "href": "http://localhost:8082/types/22"
        }
      }
    }

这是一个简单的实体,但我需要添加的其他实体包含很多字段,因此不使用@Data注释将是一个巨大的损失。

以下是我pom.xml档案。在Lombok和Spring数据resta注释之间有任何不兼容的问题吗?

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0-M1</version>
        <relativePath/>
    </parent>
    
    <groupId>eu.myapp</groupId>
    <artifactId>myapp-service</artifactId>
    <version>2.0.0-SNAPSHOT</version>
    <name>myapp-service</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <docker.image.prefix>myapp.eu</docker.image.prefix>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.2.3</version>
                <configuration>
                    <imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
            <!-- Maven Dependency Plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.1.2</version>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </pluginRepository>
    </pluginRepositories>

    </project>

共有1个答案

祖翰音
2023-03-14

根据RestResource的Java文档

使用此注释对存储库进行注释,以影响其导出方式以及链接中rel属性的值
从SpringDataREST2.0开始,更喜欢使用RepositoryRestResource,以便能够自定义存储库公开的项目资源的关系类型和描述。

因此,不要将@RestResource(path=“types”,rel=“types”)添加到类DeviceType,而是将@RepositoryRestResource(path=“types”,collectionResourceRel=“types”)添加到存储库接口DeviceTypeRepository

path值定义要导出此资源的路径段。因此URI从http://localhost:8082/deviceTypeshttp://localhost:8082/types。在POST请求中使用新URI。

collectionResourceRel值定义了生成指向集合资源的链接时要使用的关系值,即\u links下的名称。以你为例,,

json prettyprint-override">    {
      "_links": {
        "self": {
          "href": "http://localhost:8082/types/22"
        },
        "types": {  <-- this name !!!!!!!!!!!!!!!!!!!!!!!!!
          "href": "http://localhost:8082/types/22"
        }
      }
    }

示例项目已上载到Github。第一次提交在add@RepositoryRestResource之前,第二次提交在add@RepositoryRestResource之后。该项目包含用于验证路径和集合关系更改的测试用例。

 类似资料:
  • 我试图用jqGrid解决Spring Data Rest的问题,所有的事情都很好,除了我想要将对象全部作为序列化返回,所以在ManyToOne关系中,我现在只得到该对象的链接,而我想要将它序列化。 如您所见,中的accountManager类返回为link,但我希望它也被序列化,以便在JQGrid中显示Name属性。 向Shahbour问好

  • 我有一个Spring Data JPA项目来访问我的数据库并检索用户凭据。我将这个项目打包为jar(不是可执行jar),并将其作为maven依赖项包含到另一个Spring boot项目中,因为我想重用以前开发的相同实体和存储库。每次运行Spring Boot应用程序时,都会出现以下错误: 我开始怀疑我正在做的事情是否可能?PS:我不想将JPA项目与控制器和服务项目混合在一起

  • 我们得到了异常:参数值元素[1]与预期类型[java.lang.long(N/A)]不匹配 上面的存储库有什么问题?传递数字ID的正确方法是什么?

  • 我是Spring靴的初学者。我参与了一个项目的开始,在这个项目中,我们将使用Spring引导构建Rest服务。当构建一个只公开其余服务的项目时,您能建议遵循推荐的目录结构吗?

  • 我最近开始在我的项目中使用。在lombok文档中,指定注释可以配置为抛出或。指定默认情况下将抛出。还指定要抛出,我应该设置。但是,我不明白应该在哪里指定` 请帮帮我。非常感谢。

  • 我在项目中使用SpringBoot和lombok,遇到了一些问题。我的班级是这样的: 现在,如果使用jackson ObjectMapper创建ElementEntity,则会出现以下运行时错误: 通用域名格式。fasterxml。杰克逊。数据绑定。exc.InvalidDefinitionException:无法构造的实例(不存在与默认构造类似的创建者):无法从对象值反序列化(没有委托或基于属性