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
hai trovato alcuna soluzione per il problema di cui sopra sto affrontando lo stesso problema troppo – Shahbour
purtroppo non mi dispiace :( –
https://jira.spring.io/plugins/servlet/mobile#issue/DATAREST-687 – Shahbour