Spring Boot-使用Lombok时Rest Controller返回空对象

时间:2019-04-20 04:50:48

标签: java json rest spring-boot lombok

我正在使用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

4 个答案:

答案 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)

确保启用选项注释处理,然后重新运行项目 make sure enable the option annotation processing