程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了loadAll() 和 loadById(Long id) 时 JSON 序列化的差异大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决loadAll() 和 loadById(Long id) 时 JSON 序列化的差异?

开发过程中遇到loadAll() 和 loadById(Long id) 时 JSON 序列化的差异的问题如何解决?下面主要结合日常开发的经验,给出你关于loadAll() 和 loadById(Long id) 时 JSON 序列化的差异的解决方法建议,希望对你解决loadAll() 和 loadById(Long id) 时 JSON 序列化的差异有所启发或帮助;

我创建了文件夹类(java springboot),它描述了书签管理的多级文件夹结构:

@Entity
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
**public class Folder** implements serializable {

    @ID
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long ID;

    @manyToOne(cascade = CascadeType.PERSIST)
    @Joincolumn(name = "parent_ID")
    @JsonIDentityInfo(
            generator = ObjectIDGenerators.PropertyGenerator.class,property = "ID")
    private Folder parent;

    @OnetoMany(mappedBy = "parent",cascade = CascadeType.PERSIST)
    private List<Folder> children = new ArrayList<>();

    private String name;

    private String path;

    @OnetoMany(mappedBy = "folder",cascade = CascadeType.PERSIST)
    @JsonManagedReference
    private List<Bookmark> bookmarkList = new ArrayList<>();
}

@Entity
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
**public class Bookmark** implements serializable {

    @ID
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long ID;

    private String name;

    private String url;

    private String description;

    /**
     * parent folder
     */
    @manyToOne
    @JsonBACkReference
    private Folder folder;
}

我的问题是,当 loadAll() 和 loadByID(Long ID) 时,我可以看到序列化 JsON 的差异:

@service
@transactional
**public class Folderservice** {

    private FolderRepo folderRepo;

    @autowired
    public Folderservice(FolderRepo folderRepo) {
        this.folderRepo = folderRepo;
    }

    public voID save(Folder folder) {
        folderRepo.save(folder);
    }

    public List<Folder> loadAll() {
        List<Folder> folderList = folderRepo.findAll();
        return folderList;
    }

    public Folder loadByID(Long ID) {
        Folder folder = folderRepo.findByID(ID).get();
        return folder;
    }

}

@RestController
@requestMapPing("/bookmarks-app")
**public class FolderControllerRest** {

    private Folderservice folderservice;

    @autowired
    public FolderControllerRest(Folderservice folderservicE) {
        this.folderservice = folderservice;
    }

    @GetMapPing("/folders/all")
    public List<Folder> getFolderListAll() {
        List<Folder> folderList = folderservice.loadAll();
        return folderList;
    }

    @GetMapPing("/folder/{ID}")
    public Folder getFolderByID(
            @PathVariable(name = "ID") String ID
    ) {
        if (!"undefined".equals(ID)) {
            Long folderID = Long.parseLong(ID);
            return folderservice.loadByID(folderID);
        } else return null;
    }

}

也就是说,区别在于。在 folder.ID=2 中。

当我使用AJAX加载所有内容时:

$.AJAX({
        url: "/bookmarks-app/folders/all",data: {},method: "GET",dataType: "JsON"
    });

父实体序列化为其“ID”编号(如我所愿),

但是当使用AJAX时:

 $.AJAX({
    url: "/bookmarks-app/folder/2",dataType: "JsON"
 })

父实体序列化为对象(如下截图)。

screenshoot

解决方法

我认为您误用了@JsonIdentityInfo,文档说

@JsonIdentityInfo 允许在序列化期间第二次遇到 POJO 时通过 id 对其进行序列化。

然后在“列表”模式下您获得 id,在单一模式下您获得整个对象。

也许你应该使用 TypeAdaptor 来获取 id

大佬总结

以上是大佬教程为你收集整理的loadAll() 和 loadById(Long id) 时 JSON 序列化的差异全部内容,希望文章能够帮你解决loadAll() 和 loadById(Long id) 时 JSON 序列化的差异所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:id)