# DTO ist null



## Avalon (6. Feb 2021)

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.

```
{
"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

```
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?

```
{
"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
}
```


----------



## kneitzel (6. Feb 2021)

Avalon hat gesagt.:


> Warum sind die Privilegien null?





Avalon hat gesagt.:


> "privileges": null


Also bei dem JSON sehe ich bei privileges null, daher wäre meine Erwartungshaltung beim Deserialisieren, dass dies dann auch nach der Deserialisierung null ist.

Oder habe ich Dich jetzt falsch verstanden?


----------



## Avalon (7. Feb 2021)

Ich bin mir nicht ganz sicher. Wenn ich einen GET Request direkt auf den 
	
	
	
	





```
localhost:8080/privileges
```
 Endpunkt mache, dann funktioniert es (das untere JSON). Nur eben in der Verschachtelung nicht.


----------



## mihe7 (7. Feb 2021)

Vielleicht ist privileges in Deinem UserDTO einfach null?


----------



## Avalon (7. Feb 2021)

Das ist sicher. Aber warum? Ich denke ich hab eine heiße Spur. Mal sehen.


----------



## mihe7 (7. Feb 2021)

Entweder weil die Variable explizit auf null oder gar nicht gesetzt wird - mit den vier Zeilen von oben wird man nicht mehr sagen können


----------



## LimDul (7. Feb 2021)

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 (7. Feb 2021)

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?


----------



## LimDul (7. Feb 2021)

Weil du was falsch machst.

Das Problem ist nicht das DTO, sondern der Code der die DTOs befüllt. Und den hast bisher noch nicht gezeigt.


----------



## Avalon (7. Feb 2021)

OK. Was genau brauchst Du? Entitäten? Dtos? Mapper? Conroller? Services? Repositorys? Ich hoffe, nicht alles. :-D


----------



## Avalon (7. Feb 2021)

Jetzt sieht das JSON so aus. Ist eigentlich i.O. für mich. Jetzt hätte ich es nur noch geflattet.

```
{
    "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 (7. Feb 2021)

Die Stelle, wo du die DTOs befüllt. Also quasi den Service,. der die Daten zurückliefert.


----------



## LimDul (7. Feb 2021)

Avalon hat gesagt.:


> Jetzt sieht das JSON so aus. Ist eigentlich i.O. für mich. Jetzt hätte ich es nur noch geflattet.
> 
> ```
> {
> ...


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 (7. Feb 2021)

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 (7. Feb 2021)

Dann sollten die DTOs so wie die Entitäten aussehen. Und da scheint priviliges unterhalb von Rollen zu hängen.


----------



## Avalon (7. Feb 2021)

:-D Super. Grad beim Ansehen hab ich das auch bemerkt. Jetzt hat es klick gemacht. Hoffe ich. Danke!!!!


----------



## LimDul (7. Feb 2021)

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 (7. Feb 2021)

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


----------

