0

Я использую Spring-boot-starter-data-jpa, в моем RestController Я хочу вернуть местоположение вновь созданного объекта. Есть ли способ перевернуть @ RequestMapping, а не hardcode, как создать URL-адрес?Spring получить ссылку на объект

@RestController 
@ExposesResourceFor(BookInstance.class) 
public class BookInstanceController { 
    @RequestMapping(value="/bookInstances", method=RequestMethod.POST) 
    ResponseEntity<BookInstance> createBookInstance(@RequestBody BookInstance bookInstance){ 
    BookInstance createdBookInstance = bookInstanceRepository.save(bookInstance); 

    return ResponseEntity.created(**reverseURL(createdBookInstance)**); 
//  return new ResponseEntity<BookInstance>(createdBookInstance, HttpStatus.CREATED); 
//  return createdBookInstance; 
    } 
} 

Я всегда вижу людей жесткого кодирования их URL строительства в этой функции, которая просто оставляет меня без слов ....

Конечно, я также функцию GET в одном классе (в противном случае не будет ничего обратного)

@RequestMapping(value="/bookInstances/{id}", method=RequestMethod.GET) 
ResponseEntity<?> findOne(@PathVariable("id") Long id){ 
     BookInstance bookInstance = bookInstanceRepository.findOne(id); 
     if(bookInstance == null){ 
      return ResponseEntity.notFound().build(); 
     } 
     return new ResponseEntity<BookInstance>(bookInstance, HttpStatus.OK); 
    } 

ответ

2

Альтернативное решение, которое использует ассемблер ресурса:

public class BookInstanceResource extends Resource<BookInstance> { 

    public TaskResource(Book content, Link... links) { 
     super(content, links); 
    } 

} 

public class BookInstanceResourceAssembler extends ResourceAssemblerSupport<BookInstance, BookInstanceResource> { 

    public BookInstanceResourceAssembler() { 
     super(BookInstanceController.class, BookInstanceResource.class) 
    } 

    @Override 
    public BookInstanceResource toResource(BookInstance bookInstance) { 
     // linkTo requires the following static import: 
     // import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; 
     ControllerLinkBuilder builder = linkTo(BookInstance.class).slash("bookInstances").slash(bookInstance); 

     return new BookInstanceResource(bookInstance, 
             builder.withSelfRel(), 
             builder.withRel("bookInstance"); 
     } 
} 

В классе контроллера:

@Autowired 
private BookInstanceResourceAssembler resourceAssembler; 

@GetMapping(value = "/bookInstances/{id}") 
ResponseEntity findOne(@PathVariable("id") Long id) { 
    BookInstance bookInstance = bookInstanceRepository.findOne(id); 
    if(bookInstance == null){ 
     return ResponseEntity.notFound().build(); 
    } 

    BookInstanceResource resource = resourceAssembler.toResource(bookInstance); 

    return ResponseEntity.created(URI.create(resource.getLink("self").getHref())) 
         .body(resource); 
} 
1

Я решил его, добавив в мой класс:

@Autowired EntityLinks entityLinks; 

и используя некоторые функции HATEOAS Spring.

Link link = entityLinks.linkToSingleResource(BookInstance.class, createdBookInstance.getId()).expand(); 
return ResponseEntity.created(URI.create(link.getHref())).build(); 
Смежные вопросы