我正在使用Spring Boot 2.1.4和Gradle 5.0
开发一个简单的Rest API。我正在使用Lombok v1.18.6
构建类,但是当我调用服务时却收到一个空对象
我尝试手动添加getters和setters方法,它解决了该问题,但是我想知道为什么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:
@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": []
}
]
实际上,我发现显示的唯一属性是languages
,具有@JsonProperty
注释,这很奇怪吗?
更新
我刚刚意识到我的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
答案 0 :(得分:1)
它可能对您不起作用的原因是,如果您的项目未设置为将IDE构建委托给Gradle,并且未为该项目启用注释处理,或者配置不当。
设置->构建,执行,部署->构建工具-Gradle-> Runner
设置->构建,执行,部署->编译器->注释处理器
您是否尝试过从命令行构建并运行Gradle来排除IntelliJ中的错误配置?
答案 1 :(得分:0)
我怀疑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,这意味着实体中的单个更改将破坏缓存并可能阻止实体正确加载。
答案 2 :(得分:0)
这可能是由于categoryService.findAll();
具有不同的映射名称导致的。
例如对于idCategory
,结果为id_category
。因此,id_category
无法映射到idCategory
。
因此您可以使用
@JsonProperty("idCategory")
答案 3 :(得分:0)