0

RestControllerでSpring-boot-startter-data-jpaを使用しています。新しく作成されたオブジェクトの場所を返したいと思います。 @ RequestMappingを逆にして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; 

と、SpringのHATEOAS機能のいくつかを使用しています。

Link link = entityLinks.linkToSingleResource(BookInstance.class, createdBookInstance.getId()).expand(); 
return ResponseEntity.created(URI.create(link.getHref())).build(); 
関連する問題