Вложенные документы Spring и mongoDB

У меня есть два объекта: объект User и Permission, у каждого пользователя есть список разрешений, а у Permission тоже есть список разрешений, что означает его рекурсию. В моем mongoDB у меня есть только коллекция пользователей. у меня есть объект пользователя с двумя уровнями разрешений, и когда я пытаюсь получить объект пользователя из mongoDB, я получаю только первый уровень, а список субразрешений возвращается как нуль.

я пропустил некоторые обозначения? спасибо!

**Результат: от монго

{"sessionId":"admin","status":"OK","userName":"admin","permissions":[{"name":"MPC","link":"#/Release"," subPermissions":null},{"name":"MPC PE","link":"#","subPermissions":null}]}

Объект пользователя в монго

{
    "_id" : ObjectId("53f3731c1401dacba49cfb74"),
    "userName" : "admin",
    "email" : "[email protected]",
    "sessionId" : "admin",
    "permissions" : [
        {
            "name" : "MPC",
            "link" : "#/Release",
            "sub" : []
        },
        {
            "name" : "MPC PE",
            "link" : "#",
            "sub" : [
                {
                    "name" : "Validate @ Release",
                    "link" : "#/mpcToPeRelease",
                    "sub" : []
                },
                {
                    "name" : "View Report",
                    "link" : "#/mpcToPeReport",
                    "sub" : []
                }
            ]
        }
    ]
}

Класс пользователя в Java

@Document(collection="users")
public class User {

    private String id;

    private String userName;

    private String email;

    private String sessionId;

    private ArrayList<Permission> permissions;

    public String getUserName() {
        return userName;
    }

    public String getSessionId() {
        return sessionId;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }

    public String getEmail() {
        return email;
    }

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

    public ArrayList<Permission> getPermissions() {
        return permissions;
    }

    public void setPermissions(ArrayList<Permission> permissions) {
        this.permissions = permissions;
    }
}

и класс разрешений в Java:

@Document
public class Permission {

    private String name;
    private String link;

    private ArrayList<Permission> subPermissions;

    public String getName() {
        return name;
    }

    public String getLink() {
        return link;
    }

    public ArrayList<Permission> getSubPermissions() {
        return subPermissions;
    }

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

    public void setLink(String link) {
        this.link = link;
    }

    public void setSubPermissions(ArrayList<Permission> subPermissions) {
        this.subPermissions = subPermissions;
    }
}

person user2303962    schedule 21.08.2014    source источник


Ответы (1)


Не уверен, что это единственная проблема, но вы должны аннотировать поле subPermissions с помощью @Field("sub"), иначе Spring сопоставит его с (несуществующим) полем MongoDB с именем subPermissions.

Также обратите внимание, что аннотирование класса Permission с помощью Document является избыточным, поскольку на самом деле это не документ первого уровня, а поддокумент. В любом случае это не ошибка.

person Ori Dar    schedule 21.08.2014
comment
где я могу найти документацию по @field(sub)? - person user2303962; 21.08.2014
comment
Справочная документация - person Ori Dar; 21.08.2014
comment
Стоит уточнить, что @Field(sub) просто говорит о том, что хранилище поля в mongdb должно находиться под ключом с именем sub. Значение sub не является волшебным. - person Wheezil; 02.03.2017
comment
Вы меня реально спасли!!!! @Field мне очень помог. Большое спасибо, приятель. - person ashokramcse; 01.11.2019