DTO ist null

Avalon

Bekanntes Mitglied
Ich baue grad mal wieder an einem REST API mit Spring Boot herum.
Ein GET Request auf einen User Endpunkt liefert folgendes JSON Objekt zurück.
(User mit seinen Rollen und Privilegien)
Es handelt sich dabei um ein verschachteltes DTO.
JSON:
{
"id": 1,
"firstname": "Test",
"lastname": "Test",
"username": "Avalon",
"email": "test@test.com",
"password": "$2a$10$9RC/TnRqqv.iH/ThDN7tWu90XLoo8WMgkpRYKPA134aFHi6vOeFuC",
"passwordconfirm": null,
"enabled": true,
"tokenexpired": false,
"roles": [
{
"name": "ROLE_ADMIN"
}
],
"privileges": null
}
mein User DTO sieht stark vereinfacht so aus
Java:
public class UserDto {
        private Collection<RoleDto> roles;
        private Collection<PrivilegeDto> privileges;
}
Warum sind die Privilegien null?
Wenn ich einen GET Request nur auf die Privilegien mache, wird ein JSON Objekt mit den Daten zurückgeliefert. Das funktioniert.
Wo muss ich anfangen zu suchen? Kann mir jemand helfen?
JSON:
{
"content": [
{
"id": 1,
"name": "READ_PRIVILEGE"
},
{
"id": 2,
"name": "WRITE_PRIVILEGE"
}
],
"pageable": {
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"offset": 0,
"pageNumber": 0,
"pageSize": 10,
"unpaged": false,
"paged": true
},
"totalElements": 2,
"totalPages": 1,
"last": true,
"size": 10,
"number": 0,
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"numberOfElements": 2,
"first": true,
"empty": false
}
 

Avalon

Bekanntes Mitglied
Ich bin mir nicht ganz sicher. Wenn ich einen GET Request direkt auf den
Code:
localhost:8080/privileges
Endpunkt mache, dann funktioniert es (das untere JSON). Nur eben in der Verschachtelung nicht.
 

LimDul

Top Contributor
Vielleicht lieferst du mal mehr Kontext, was du tust:

* Rufst du einen (fremden) Service auf und wunderst dich das im DTO es null ist? => Kein wunder, denn der Service liefert null
* Rufst du deinen eigenen Service auf und wunderst dich, dass null kommt => Dann ist nicht das DTO das interessante, sondern die Stelle, wo die Daten ermittelt und über den Service zurückgegeben werden.
 

Avalon

Bekanntes Mitglied
Ich habe die Lösung. Wenn ich das PrivilegeDto mit in das RoleDto reinpacke, dann funktioniert es. Also in UserDto ist Role Dto und darin ist dann PrivilgeDto. RoleDto UND PrivilegeDto in UserDto klappt nicht. Aber warum?
 

Avalon

Bekanntes Mitglied
Jetzt sieht das JSON so aus. Ist eigentlich i.O. für mich. Jetzt hätte ich es nur noch geflattet.
JSON:
{
    "id": 1,
    "firstname": "Test",
    "lastname": "Test",
    "username": "Avalon",
    "email": "test@test.com",
    "password": "$2a$10$.zywwDazLvC9srdDWuhp3eAvlVpolETRpUY4hQ4soq.j0Jsygu.gy",
    "passwordconfirm": null,
    "enabled": true,
    "tokenexpired": false,
    "roles": [
        {
            "id": 1,
            "name": "ROLE_ADMIN",
            "privileges": [
                {
                    "id": 1,
                    "name": "READ_PRIVILEGE"
                },
                {
                    "id": 2,
                    "name": "WRITE_PRIVILEGE"
                }
            ]
        }
    ]
}
 

LimDul

Top Contributor
Jetzt sieht das JSON so aus. Ist eigentlich i.O. für mich. Jetzt hätte ich es nur noch geflattet.
JSON:
{
    "id": 1,
    "firstname": "Test",
    "lastname": "Test",
    "username": "Avalon",
    "email": "test@test.com",
    "password": "$2a$10$.zywwDazLvC9srdDWuhp3eAvlVpolETRpUY4hQ4soq.j0Jsygu.gy",
    "passwordconfirm": null,
    "enabled": true,
    "tokenexpired": false,
    "roles": [
        {
            "id": 1,
            "name": "ROLE_ADMIN",
            "privileges": [
                {
                    "id": 1,
                    "name": "READ_PRIVILEGE"
                },
                {
                    "id": 2,
                    "name": "WRITE_PRIVILEGE"
                }
            ]
        }
    ]
}
Ja, aber leider total egal.

Du rückst nicht raus - willst du DTO => JSON oder jSON => DTO Machen?

Du wirfst nur zusammenhanglose Bruchstücke hin
 

Avalon

Bekanntes Mitglied
Ich befülle die Dtos nicht in einem Service. In der Service Implementation stehen die Standard CRUD Methoden. Die dort zurückgegebenen Entitäten aus der DB mappe ich dann im Controller mittels Mapstruct auf die Dtos.
 

LimDul

Top Contributor
Grundsätzlich kannst du mapstruct so einstellen, dass es meckert, wenn Dinge nicht gemappt werden - dann fällt sowas sofort auf. (dann bekommt man lauter unmapped target property warnungen bzw. errors).

Aber ich bin eh mittlerweile kein Freund von mapstruct mehr, wir schaffen das bei uns perspektivisch ab und mappen von Hand
 

Avalon

Bekanntes Mitglied
Sehr geil. Ich mach das seit 4 Monaten. Coden kann man das nicht nennen. Eher alle möglichen Tools unter eine Haube zu bekommen, um daraus ein Programm zu stricken. :-D (Eclipse, Maven, Spring, Spring Boot, Mapstruct, Micrometer, Swagger, Graphana, ActiveMQ Artemis, MariaDB, AsyncAPI, Prometheus, usw. Ich flipp hier noch aus. Das hatte ich mir irgendwie anders vorgestellt. :-D
 

Ähnliche Java Themen

Neue Themen


Oben