简体   繁体   English

无法在 Spring Boot 中反序列化嵌套对象“Role”

[英]Unable to deserialize nested object "Role" in Spring boot

I'm new to Spring boot.我是 Spring Boot 的新手。 Trying to fetch all the documents from employee collections which has some roles associated with them.when tried fetching all employee documents using "findAll()" method from mongo repository, I'm getting empty roles as shown below in the output.尝试从员工集合中获取所有文档,这些文档与某些角色相关联。当尝试使用 mongo 存储库中的“findAll()”方法获取所有员工文档时,我得到了空角色,如下面的输出所示。

Note : Roles are associated with each employee in MongoDB. 

在此处输入图片说明

Output of REST call REST 调用的输出

[
    {
        "id": 0,
        "name": null,
        "organization": null,
        "email": null,
        "password": null,
        "roles": null,
        "enabled": false,
        "skills": null
    },
    {
        "id": 123,
        "name": "Harry",
        "organization": "Hollywood",
        "email": "harry@demo.com",
        "password": "HarryMovie",
        "roles": [],
        "enabled": true,
        "skills": [
            "Performer",
            "Entertainer",
            "Actor",
            "Producer"
        ]
    },
    {
        "id": 1902,
        "name": "Harry",
        "organization": "Hollywood",
        "email": "harry@demo.com",
        "password": "HarryMovie",
        "roles": [],
        "enabled": true,
        "skills": [
            "Performer",
            "Entertainer",
            "Actor",
            "Producer"
        ]
    }
]

Employee.class员工类

package com.app.TestSecurityApp.Pojo;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;
import java.util.List;
import java.util.Set;

@Document(collection="employee")
public class Employee implements Serializable {

    @Id
    private int id;
    private String name;
    private String organization;
    private String email;
    private String password;
    @DBRef
    private List<Role> roles;
    private boolean enabled;
    private List <String> skills;



    public Employee() {
    }


    public List <Role> getRoles() {
        return roles;
    }

    public void setRoles(List <Role> roles) {
        this.roles = roles;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }



    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getorganization() {
        return organization;
    }

    public void setorganization(String organization) {
        this.organization = organization;
    }

    public List <String> getSkills() {
        return skills;
    }

    public void setSkills(List <String> skills) {
        this.skills = skills;
    }



    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", organization='" + organization + '\'' +
                ", email='" + email + '\'' +
                ", password='" + password + '\'' +
                ", roles=" + roles +
                ", enabled=" + enabled +
                ", skills=" + skills +
                '}';
    }
}

Role.class角色类

package com.app.TestSecurityApp.Pojo;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.IndexDirection;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;


@Document(collection = "role")
public class Role{


    @Id
    private int id;

    @Indexed(unique = true, direction = IndexDirection.DESCENDING, dropDups = true)
    private String role;

    public Role(String role) {
        this.id = id;
        this.role = role;
    }

    public Role() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Role(int id, String role) {
        this.id = id;
        this.role = role;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    @Override
    public String toString() {
        return "Role{" +
                "id=" + id +
                ", role='" + role + '\'' +
                '}';
    }
}

Spring Controller:弹簧控制器:

package com.app.TestSecurityApp.controllers;


import com.app.TestSecurityApp.Pojo.Employee;
import com.app.TestSecurityApp.Pojo.Role;
import com.app.TestSecurityApp.repository.EmployeeRepsitory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.lang.invoke.MethodType;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping(value = "/employee")
public class EmployeeAccessControllers {

    @Autowired
    EmployeeRepsitory employeeRepsitory;


    @RequestMapping(value = "/get", method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
    public List<Employee> getEmployeeList() {
        return employeeRepsitory.findAll();

    }

    @RequestMapping(value = "/set", method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
    public Employee setEmployee(@RequestBody Employee employee) {

        employeeRepsitory.save(employee);
        return employee;

    }


}

It's not serializing properly, because it does not implement the marking interface.它没有正确序列化,因为它没有实现标记接口。 Change public class Role to public class Role implements Serializable .public class Role更改为public class Role implements Serializable

Also @DBRef is not needed, it's used to store parent with children as separate documents in db together with references.也不需要@DBRef,它用于将父级和子级作为单独的文档与引用一起存储在 db 中。 Adding serialization to all classes, makes the document embedded.向所有类添加序列化,使文档嵌入。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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