繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM