2015-11-15 11 views
6

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

+1

haben Sie eine Lösung für das oben beschriebene Problem finden ich das gleiche Problem konfrontiert bin zu – Shahbour

+0

leider kein leiden :( –

+0

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

Antwort

1

Um den HAL MessageConverter zu verwenden, sollten Sie eine Ressource als Parameter haben. Versuchen Sie, Ihren Code:

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

Zum Zeitpunkt, als ich diese Frage gestellt habe, erweitert eine ShoppingList ResourceSupport –

0

In meinem Fall war das Problem ein Unterschied zwischen dem Feldnamen in der pojo und das json Feld. das heißt:

@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" 
} 

achten, dass die json Feld sollte "myOther" statt sein.

Hoffe das hilft jemandem.

Verwandte Themen