example data custom baeldung java spring jackson spring-data spring-data-rest

java - custom - Spring Data Rest: la deserialización de RepositoryRestController de URI no funciona



spring data rest example (2)

Mi problema es la deserialización de entidades de URI-String. Cuando uso la interfaz HTTP de Spring Data Rest, todo funciona bien. Puedo publicar el siguiente JSON en mi endpoint /api/shoppingLists y se deserializará en una lista de compras con el administrador como propietario.

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

}

Cuando uso un RepositoryRestController personalizado, esto ya no funciona. Si publico exactamente el mismo JSON en el mismo punto final obtengo esta respuesta.

{ "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: java.io.PushbackInputStream@9cad4d2; 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: java.io.PushbackInputStream@9cad4d2; line: 1, column: 26] (through reference chain: de.yannicklem.shoppinglist.core.list.entity.ShoppingList[/"owners/"]->java.util.HashSet[0])", "path" : "/api/shoppingLists" }

My 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)); } }

¿Alguien podría decirme por qué la deserialización ya no funciona con un RepositoryRestController personalizado (sugerido por los documentos )?

Para aprovechar las configuraciones de Spring Data REST, los conversores de mensajes, el manejo de excepciones y más, use la anotación @RepositoryRestController en lugar de un Spring MVC @Controller o @RestController estándar.

Para ver el código fuente completo, eche un vistazo al repositorio de GitHub.


Para usar HAL MessageConverter, debe tener un Recurso como parámetro. Intenta cambiar tu código a:

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


En mi caso, el problema era una diferencia entre el nombre del campo en el pojo y el campo json. es decir:

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

preste atención que el campo json debería ser " myOther " en su lugar.

Espero que esto ayude a alguien.