[英]Spring Boot Rest API Returns Empty JSON Used with Lombok
[英]Spring Boot - Rest Controller is returning empty object when using Lombok
我正在使用 Spring Boot 2.1.4 和Gradle 5.0
开发一个简单的 Rest API。 我正在使用Lombok v1.18.6
来构建我的类,但是当我调用服务时,我收到了一个空对象
我尝试手动添加 getter 和 setter 方法并解决了问题,但我想知道为什么lombok
在我的项目中不起作用。
此外,我的 IDE 正在正确识别 lombok 插件。 我正在使用 IntelliJ IDEA
我的gradle依赖:
compileOnly 'org.projectlombok:lombok:1.18.6'
annotationProcessor 'org.projectlombok:lombok:1.18.6'
我的模型类:
@Entity
@Data
public class Category implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_category")
private int idCategory;
@NotBlank
private String name;
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private List<Language> languages;
}
我的休息控制器:
@RestController
@RequestMapping("/categories")
public class CategoryController {
@Autowired
private CategoryService categoryService;
@GetMapping
public ResponseEntity<List<Category>> findAllCategories(){
List<Category> categories = categoryService.findAll();
return new ResponseEntity<List<Category>>(categories, HttpStatus.OK);
}
}
我收到此回复:
[
{
"languages": []
}
]
但我期待收到的是:
[
{
"idCategory": 1,
"name": "Backend"
"languages": []
}
]
实际上,我觉得奇怪的是,显示的唯一属性是具有@JsonProperty
注释的languages
,为什么会发生这种情况?
更新
我刚刚意识到我的 IDE (IntelliJ) 正在识别 lombok 插件,并且我也启用了注释处理,但是当我尝试使用 getter 或 setter 执行我的代码时,它会引发错误:
Error:(18, 26) java: cannot find symbol
symbol: method setName(java.lang.String)
location: class com.ramonparis.cvmanager.model.Category
它可能不适合您的原因是,您的项目未设置为将IDE构建委派给Gradle,并且未对项目启用注释处理,或者以某种方式错误配置。
设置 - >构建,执行,部署 - >构建工具 - Gradle - > Runner
设置 - >构建,执行,部署 - >编译器 - >注释处理器
您是否尝试从命令行构建并运行Gradle,以排除IntelliJ中的错误配置?
我怀疑Hibernate不喜欢Lombok自动生成的完全等号。 你应该试试:
@Entity
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Category implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@EqualsAndHashCode.Include
@Column(name = "id_category")
private int idCategory;
Hibernate希望它的上下文缓存在PrimaryKeys上匹配,但是Lombok生成一个匹配所有字段的Equals,这意味着实体中的单个更改将破坏缓存并可能阻止实体正确加载。
这可能是由于categoryService.findAll();
具有不同的映射名称。
例如,对于idCategory
,结果有id_category
。 由于这个id_category
没有被映射到idCategory
。
所以你可以使用,
@JsonProperty("idCategory")
你可以用这个注释
@JsonProperty("idCategory")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.