0

у меня есть какой-то метод контроллера, как:Spring Hateoas Deserialize Ссылки в Payload для реальных лиц

@RequestMapping(value = "/person", method = RequestMethod.POST) 
public ResponseEntity<?> create(@RequestBody Person person) { 
    personRepository.save(person); 
    return new ResponseEntity<>(HttpStatus.OK); 
} 

Человек полезной нагрузки (ссылка указывает на Ури отдела):

{ 
    "name": "Barack Obama", 
    "department": "http://localhost:8080/department/1" 
} 

I есть PersonResource

public class PersonResource { 
    String name; 
} 

И в ResourceAssembler

public class PersonResourceAssembler extends ResourceAssemblerSupport<PersonResource, Person> { 
    public PersonResourceAssembler() { 
    super(PersonController.class, PersonResource.class); 
    } 

    @Override 
    public PersonResource toResource(Person person) { 
    PersonResource res = new PersonResource(); 
    res.setName(person.getName()); 
    res.add(linkTo(methodOn(DepartmentController.class).getOne(person.getDepartment().getId())).withRel("department"); 
    } 
} 

DepartmentController

@RestController 
@RequestMapping("/department") 
public class DepartmentController { 
    @RequestMapping("/{id}") 
    public ResponseEntity<DepartmentResource> getOne(@PathVariable("id") Long id) { 
    Department dep = departmentRepository.findOne(id); 
    DepartmentResource res = departmentResourceAssembler.toResource(res); 
    return new ResponseEntity<>(res, HttpStatus.OK); 
    } 
} 

Это приведет в JSON как:

{ 
    "name": "Barack Obama", 
    "_links": { 
    "department": { 
     "href": "http://localhost:8080/department/1" 
    } 
    } 
} 

Теперь проблема: Когда я посылаю создать-запрос с полезной нагрузкой, Джексон или Spring Rest/HATEOAS не может обрабатывать ссылки во время десериализации. Что мне нужно для настройки/внедрения, чтобы это работало?

Спасибо!

+0

Вы несете ответственность за это сам. Вы можете взглянуть на Spring Data REST. – zeroflagL

ответ

0

Я думаю, что здесь вы должны вернуть HttpEntity, а затем ResponseEntity

Так было бы:

@RequestMapping(value = "/person", method = RequestMethod.POST) 
public HttpEntity create(@RequestBody Person person) { 
    personRepository.save(person); 
    return new ResponseEntity<>(HttpStatus.OK); 
} 

И что DepartmentController выглядит?

+0

Я добавил контроллер отдела, но этот вопрос касается не сериализации, а скорее десериализации ссылок. ResponseEntity отлично работает (и, кстати, является подклассом HttpEntity). – Benny

0

Ваши опубликованные классы ресурсов должны отличаться от классов, возвращаемых конечными точками GET. Они должны содержать элементы для определения ресурса, который нужно связать, чем вы должны решить его самостоятельно.

Если вы посмотрите на этом образце проекте https://github.com/opencredo/spring-hateoas-sample и конкретно BookController, вы можете увидеть, как новый Book размещены и связанные с Author сек разрешаются

Смежные вопросы