2015-11-15 20 views
6

Il mio problema è la deserializzazione di entità dalla stringa URI. Quando utilizzo l'interfaccia HTTP generata da Spring Data Rest, tutto funziona correttamente. Posso postare il seguente JSON contro il mio endpoint /api/shoppingLists e verrà deserializzato in una lista della spesa con admin come proprietario.Spring Data Rest: La deserializzazione di RepositoryRestController dall'URI non funziona

{ 
    "name":"Test", 
    "owners":["http://localhost:8080/api/sLUsers/admin"] 

}

Quando uso una consuetudine RepositoryRestController questo non funziona più. Se posto esattamente lo stesso JSON sullo stesso endpoint ricevo questa risposta.

{ 
    "timestamp" : "2015-11-15T13:18:34.550+0000", 
    "status" : 400, 
    "error" : "Bad Request", 
    "exception" : "org.springframework.http.converter.HttpMessageNotReadableException", 
    "message" : "Could not read document: Can not instantiate value of type [simple type, class de.yannicklem.shoppinglist.core.user.entity.SLUser] from String value ('http://localhost:8080/api/sLUsers/admin'); no single-String constructor/factory method\n at [Source: [email protected]; line: 1, column: 26] (through reference chain: de.yannicklem.shoppinglist.core.list.entity.ShoppingList[\"owners\"]->java.util.HashSet[0]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class de.yannicklem.shoppinglist.core.user.entity.SLUser] from String value ('http://localhost:8080/api/sLUsers/admin'); no single-String constructor/factory method\n at [Source: [email protected]; line: 1, column: 26] (through reference chain: de.yannicklem.shoppinglist.core.list.entity.ShoppingList[\"owners\"]->java.util.HashSet[0])", 
    "path" : "/api/shoppingLists" 
} 

mio RepositoryRestController:

@RepositoryRestController 
@ExposesResourceFor(ShoppingList.class) 
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) 
public class ShoppingListRepositoryRestController { 

    private final ShoppingListService shoppingListService; 

    private final CurrentUserService currentUserService; 

    @RequestMapping(method = RequestMethod.POST, value = ShoppingListEndpoints.SHOPPING_LISTS_ENDPOINT) 
    @ResponseBody 
    @ResponseStatus(HttpStatus.CREATED) 
    public PersistentEntityResource postShoppingList(@RequestBody ShoppingList shoppingList, 
    PersistentEntityResourceAssembler resourceAssembler) { 

    if (shoppingListService.exists(shoppingList)) { 
     shoppingListService.handleBeforeSave(shoppingList); 
    } else { 
     shoppingListService.handleBeforeCreate(shoppingList); 
    } 

    return resourceAssembler.toResource(shoppingListService.save(shoppingList)); 
    } 
} 

Qualcuno potrebbe dirmi il motivo per cui la deserializzazione non funziona più con un RepositoryRestController personalizzato (che viene suggerita dal docs)?

Per sfruttare le impostazioni di primavera dati REST, convertitori di messaggi, gestione delle eccezioni, e di più, usare l'annotazione @RepositoryRestController al posto di uno standard di Spring MVC @Controller o @RestController

Per il sorgente completo codice si prega di dare un'occhiata al GitHub repo

+1

hai trovato alcuna soluzione per il problema di cui sopra sto affrontando lo stesso problema troppo – Shahbour

+0

purtroppo non mi dispiace :( –

+0

https://jira.spring.io/plugins/servlet/mobile#issue/DATAREST-687 – Shahbour

risposta

1

Per utilizzare HAL MessageConverter si dovrebbe avere una risorsa come un parametro. Provare a cambiare il codice per:

public PersistentEntityResource postShoppingList(@RequestBody Resource<ShoppingList> shoppingList) 
+0

Al momento in cui ho posto questa domanda, ShoppingList estende ResourceSupport –

0

Nel mio caso il problema era una differenza tra il nome del campo al POJO e il campo JSON. cioè:

@Entity 
public class Pojo{ 

    @ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }) 
    @JoinColumn(name = "fk_myother") 
    public Other myOther; 
...etc 
} 

POST -> /dao/pojos 
{ 
    "myother":"http://localhost:8034/dao/others/50" 
} 

fare attenzione che il campo JSON dovrebbe essere "myOther" invece.

Spero che questo aiuti qualcuno.