在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>
根据RestResource的Java文档
使用此注释对存储库进行注释,以影响其导出方式以及链接中rel属性的值
从SpringDataREST2.0开始,更喜欢使用RepositoryRestResource,以便能够自定义存储库公开的项目资源的关系类型和描述。
因此,不要将@RestResource(path=“types”,rel=“types”)
添加到类DeviceType
,而是将@RepositoryRestResource(path=“types”,collectionResourceRel=“types”)
添加到存储库接口DeviceTypeRepository
。
path
值定义要导出此资源的路径段。因此URI从http://localhost:8082/deviceTypes
至http://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:无法构造的实例(不存在与默认构造类似的创建者):无法从对象值反序列化(没有委托或基于属性