当前位置: 首页 > 知识库问答 >
问题:

Spring 启动 - 其余控制器在使用龙目岛时返回空对象

聂鹏云
2023-03-14

我正在使用Spring Boot 2.1.4和Gradle 5.0开发一个简单的Rest API。我正在使用Lombok v1.18.6构建我的类,但当我调用服务时,我收到了一个空对象

我尝试手动添加getters和setters方法,它解决了这个问题,但我想知道为什么< code>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;
}

我的rest控制器:

@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": []
    }
]

实际上,我觉得奇怪的是,唯一显示的属性是语言,它具有@Json属性注释,为什么会发生这种情况?

更新

我刚刚意识到我的 IDE (IntelliJ) 正在识别龙目岛插件,并且我还启用了注释处理,但是当我尝试使用 getter 或 setter 执行我的代码时,它会抛出错误:

Error:(18, 26) java: cannot find symbol
  symbol:   method setName(java.lang.String)
  location: class com.ramonparis.cvmanager.model.Category

共有2个答案

朱保赫
2023-03-14

我怀疑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,这意味着实体中的单个更改将损坏缓存,并可能阻止正确加载实体。

孔君浩
2023-03-14

它可能不适合您的原因是,如果您的项目未设置为将IDE构建委托给Gradle,并且未为项目启用注释处理,或者以某种方式配置错误。
设置-

您是否尝试过从命令行构建和运行Gradle,以排除IntelliJ中的错误配置?

 类似资料:
  • 但是,当我返回列表时,就像这段代码: 对于完全相同的API的列表返回类型的响应是正确的响应: [{“SellingPrice”:23000,“ID”:1,“Version”:1,“CreatedOn”:“25Feb 2019,05:53”,“LastUpdatedOn”:“25Feb 2019,05:53”}]

  • 我在gradle项目中使用lombok,希望创建一个jar文件,但每次我执行jar任务(无论是在控制台还是eclipse ide中触发)时,我都会发现错误,我的lombok导入在我使用lombok注释的类中找不到。输出示例: 搜索了一段时间后,我发现有一个适用于gradle和lombok的插件,但在使用较新的gradle版本编译时并不真正需要。我的gradle版本是3.4.1和lombok 1.6

  • 我有一个名为Address的类,如下所示: 在这里,我不得不编写生成器和Getter,因为如果我想在使用Lombok时返回一个Optional,我必须将第2行声明为Optional 是否有其他方法可以将lombok与

  • Lombok@Data annotation将在带注释的类上无声地添加字段的setter和getter。 如何在龙目岛添加基于条件的setter? lombok中有没有这样的支持 我已经在龙目岛文件中搜索了,我没有看到关于我的问题的解释。

  • 我正在使用Lombok的注释在我的类中创建一个超级构造函数。 我的抽象控制器类: 我的控制器实现类: 我的服务类别: 基本上,我希望Lombok在中创建一个类似的构造函数 我的应用程序无法启动,错误消息如下所示: MyAbstractControllerImpl中构造函数的参数0需要类型为“MyAbstractControllerImpl$MyAbstractControllerImpBuilde

  • 我有以下控制器: 当响应为HttpStatus时。好的,我可以读取客户端中的字符串响应: 但是当我返回Httpstatus时。BAD_REQUEST响应总是空的: 即使e.getMessage()具有消息的有效字符串。 这是我用于使用此服务的代码: