2017-10-25 5 views
0

Ich benutze Spring Boot, in dem ich möchte eine Methode, um Details der Person mit ihren Land Details zu erhalten. Eine Person kann beliebig viele Länder haben. Ich habe folgende Methode erstellt, aber es funktioniert nichtVeröffentlichen von zwei verschiedenen JSON-Objekten

@PutMapping("/fl-details/{f}/{l}") 
@Timed 
public ResponseEntity<PersonDetailsDTO> updateDetails(@RequestParam("f") PersonDetailsDTO personDetailsDTO, 
    @RequestParam("l") List<LandDetailsDTO> landDetailsDTOS) throws URISyntaxException { 
    if (personDetailsDTO.getId() == null || landDetailsDTOS.iterator().next().getId() == null) { 
     return createFarmerDetails(personDetailsDTO,landDetailsDTOS); 
    } 

    PersonDetailsDTO result = personDetailsService.save(personDetailsDTO); 

    landDetailsDTOS.stream().forEach(landDetailsService::save); 

    return ResponseEntity.ok() 
     .headers(HeaderUtil.createEntityUpdateAlert(ENTITY_PERSON+ENTITY_LAND, personDetailsDTO.getId().toString()))      
     .body(result); 
} 

I Person Details von

@ResponseBody PersonDetailsDTO personDetailsDTO 

posten kann, aber ich bin immer in der Post diese beiden verwechselt.

Könnte mir jemand sagen, wie konnte ich zwei verschiedene Arten von JSON-Objekten im Frühjahr Boot-API

Antwort

1

A @RequestParam kann nicht sein deserialised auf einen PersonDetailsDTO oder LandDetailsDTO (es sei denn, Sie einen benutzerdefinierten Konverter implementieren) so führen, um einen Beitrag komplexes Objekt (ob vom Typ PersonDetailsDTO oder vom Typ LandDetailsDTO) müssen Sie @ResponseBody verwenden.

Und da eine Controller-Methode kann man nur haben @ResponseBody Sie in einem zusammengesetzten Objekt übergeben müssen, werden das heißt eine, die entweder ein PersonDetailsDTO oder ein LandDetailsDTO enthalten könnte. Zum Beispiel:

class CompositeDto { 
    private PersonDetailsDTO personDetails; 
    private List<LandDetailsDTO> landDetails 
} 

Und dann verhören dies in Ihrer Controller-Methode, zum Beispiel:

if (compositeDto.containsPersonDetails()) { 
    // ... 
} else if (compositeDto.containsLandDetails()) { 
    // ... 
} 
Verwandte Themen