Mein Problem ist die Deserialisierung von Entitäten aus URI-String. Wenn ich die durch Spring Data Rest generierte HTTP-Schnittstelle verwende, funktioniert alles einwandfrei. Ich kann den folgenden JSON gegen meinen Endpunkt /api/shoppingLists
posten und es wird zu einer Einkaufsliste mit admin als Eigentümer deserialisiert.Spring Data Rest: RepositoryRestController-Deserialisierung vom URI funktioniert nicht
{
"name":"Test",
"owners":["http://localhost:8080/api/sLUsers/admin"]
}
Wenn ich einen benutzerdefinierten RepositoryRestController dies nicht mehr funktioniert. Wenn ich genau denselben JSON an denselben Endpunkt poste, erhalte ich diese Antwort.
{
"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"
}
Mein 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));
}
}
Könnte mir jemand sagen, warum die Deserialisierung funktioniert nicht mehr mit einem benutzerdefinierten RepositoryRestController (die von der docs vorgeschlagen wird)?
Vorteil von Spring Data REST Einstellungen, Nachrichtenwandler, Ausnahmebehandlung zu nehmen, und mehr, verwenden Sie die @RepositoryRestController Anmerkung anstelle eines Standard-Spring MVC @Controller oder
@RestController
Für die volle Quelle Code bitte sehen Sie sich die GitHub repo
haben Sie eine Lösung für das oben beschriebene Problem finden ich das gleiche Problem konfrontiert bin zu – Shahbour
leider kein leiden :( –
https://jira.spring.io/plugins/servlet/mobile#issue/DATAREST-687 – Shahbour