Resolvendo o URI da entidade no controlador personalizado (Spring HATEOAS)
Eu tenho um projeto baseado em spring-data-rest e também possui alguns pontos de extremidade personalizados.
Para enviar dados POST, estou usando json como
{
"action": "REMOVE",
"customer": "http://localhost:8080/api/rest/customers/7"
}
Isso é bom para o descanso de dados da primavera, mas não funciona com um controlador personalizado.
por exemplo:
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);
}
}
Quando eu ligo
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
Eu tenho uma resposta
{
"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
}
O caso case spring não pode converter um URI em uma entidade do Cliente.
Existe alguma maneira de usar o mecanismo spring-data-rest para resolver entidades por seus URIs?
Eu tenho apenas uma idéia - usar o JsonDeserializer personalizado com a análise do URI para extrair entityId e fazer uma solicitação para um repositório. Mas essa estratégia não me ajuda se eu tiver URI como "http: // localhost: 8080 / api / rest / customers / 8 / product"nesse caso eu não tenhoID do produto valor.