Resolución de URI de entidad en controlador personalizado (Spring HATEOAS)
Tengo un proyecto basado en spring-data-rest y también tiene algunos puntos finales personalizados.
Para enviar datos POST estoy usando json like
{
"action": "REMOVE",
"customer": "http://localhost:8080/api/rest/customers/7"
}
Eso está bien para spring-data-rest, pero no funciona con un controlador personalizado.
por ejemplo:
public class Action {
public ActionType action;
public Customer customer;
}
@RestController
public class ActionController(){
@Autowired
private ActionService actionService;
@RestController
public class ActionController {
@Autowired
private ActionService actionService;
@RequestMapping(value = "/customer/action", method = RequestMethod.POST)
public ResponseEntity<ActionResult> doAction(@RequestBody Action action){
ActionType actionType = action.action;
Customer customer = action.customer;//<------There is a problem
ActionResult result = actionService.doCustomerAction(actionType, customer);
return ResponseEntity.ok(result);
}
}
Cuando llamo
curl -v -X POST -H "Content-Type: application/json" -d '{"action": "REMOVE","customer": "http://localhost:8080/api/rest/customers/7"}' http://localhost:8080/customer/action
Tengo una respuesta
{
"timestamp" : "2016-05-12T11:55:41.237+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 model.user.Customer] from String value ('http://localhost:8080/api/rest/customers/7'); no single-String constructor/factory method\n at [Source: java.io.PushbackInputStream@73af10c6; line: 1, column: 33] (through reference chain: api.controller.Action[\"customer\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class logic.model.user.Customer] from String value ('http://localhost:8080/api/rest/customers/7'); no single-String constructor/factory method\n at [Source: java.io.PushbackInputStream@73af10c6; line: 1, column: 33] (through reference chain: api.controller.Action[\"customer\"])",
"path" : "/customer/action"
* Closing connection 0
}
debido a que spring spring no puede convertir un URI en una entidad del Cliente.
¿Hay alguna forma de usar el mecanismo de descanso de datos de primavera para resolver entidades por sus URI?
Solo tengo una idea: usar JsonDeserializer personalizado con el análisis de URI para extraer entityId y realizar una solicitud a un repositorio. Pero esta estrategia no me ayuda si tengo URI como "http: // localhost: 8080 / api / rest / clients / 8 / product"en ese caso no tengoidentificación de producto valor.