2014-11-25 66 views
3

我正在使用Spring HATEOAS和Spring堆棧的REST API,並且我有一些資源鏈接問題。Spring HATEOAS資源彙編程序和資源鏈接與許多變量

這裏是我的代碼:

控制器:

@RestController 
@RequestMapping("/apporteurs/{idInt}/ribs") 
public class RibController { 

    @Autowired 
    private RibResourceAssembler ribResourceAssembler; 

    @Autowired 
    private RibRepository ribRepository; 

    /** 
    * Methode GET permettant d'obtenir un Rib par son ID 
    * 
    * @param idRib ID du Rib 
    * @return RibResource 
    */ 
    @RequestMapping(value = "/{idRib}", method = RequestMethod.GET) 
    @ResponseBody 
    public RibResource getRibById(@PathVariable Long idInt, @PathVariable Long idRib) { 

     CurrentUserUtils.checkAuthorizationByApporteur(idInt); 
     return ribResourceAssembler.toResource(ribRepository.getRibById(idRib)); 
    } 

} 

彙編:

@Component 
public class RibResourceAssembler extends ResourceAssemblerSupport<Rib, RibResource> { 

    public static final long TMP_IDS = 1234L; 
    @Autowired 
    private RibResourceMapper ribResourceMapper; 

    public RibResourceAssembler() { 
     super(RibController.class, RibResource.class); 
    } 

    @Override 
    public RibResource toResource(Rib rib) { 
     return createResourceWithId(rib.getId(), rib); 
    } 

    /** 
    * TODO : mettre le lien vers l'editique Mandat 
    * 
    * @param rib Rib à instancier en Resource. 
    * @return RibResource 
    */ 
    @Override 
    protected RibResource instantiateResource(Rib rib) { 
     RibResource ribResource = ribResourceMapper.fromRib(rib, rib.getLastMandat()); 
     ribResource.removeLinks(); 

     CustomUserDetails user = CurrentUserUtils.getCurrentUser(); 

     UriComponentsBuilder uriBuilderMandat = linkTo(RibController.class).toUriComponentsBuilder(); 
     String uri = uriBuilderMandat.path("/{idRib}/mandats/{idMandat}").buildAndExpand(user.getIdInt(), rib.getId(), TMP_IDS).toUriString(); 
     Link linkEditiqueMandat = new Link(uri).withRel("editiqueMandat"); 

     UriComponentsBuilder uriBuilderRib = linkTo(RibController.class).toUriComponentsBuilder(); 
     String uriSelf = uriBuilderRib.path("/{idRib}").buildAndExpand(user.getIdInt(), rib.getId()).toUriString(); 
     Link linkUriSelf = new Link(uriSelf).withSelfRel(); 

     ribResource.add(linkEditiqueMandat); 
     ribResource.add(linkUriSelf); 

     return ribResource; 
    } 
} 

資源:

public class RibResource extends ResourceSupport { 

    private Long idRib; 
    private String rum; 
    private String iban; 
    private String libelle; 
    private String dateFin; 
    private String dateCreation; 
    private String dateModification; 
    private String codeOperateurCreation; 
    private String dateRegulationMandat; 
    private boolean actif; 
    private boolean reactivable; 
    private CodeValueResource modeReglement; 

/*Gzetter & setters, etc*/ 

} 

正如你所看到的,我的控制器在URI中有一些參數:idInt和idRib。因此,爲了創建一個SelfLink,我必須知道這個參數用於製作類似「/ apporteurs/1234/ribs/1234」的東西,但是我認爲彙編程序只需要一個參數和一個「簡單」URI。

我有這樣的堆棧跟蹤:

2014-11-25 12:02:09.365 ERROR 20860 --- [nio-9080-exec-1] w.s.m.m.a.ResponseEntityExceptionHandler : Not enough variable values available to expand 'idInt' 

所以我在尋找一個完美的解決方案要做到這一點,因爲我沒有發現任何東西^^

我看到ResourceProcessor東西,但我沒有使用Spring Data Rest。

你能幫我嗎?謝謝你在前進;)

編輯:

結果應該是:

_links": { 
     "editiqueMandat": { 
      "href": "http://localhost:9080/apporteurs/6797/mandats/5822" 
     }, 
     "self": { 
       "href": "http://localhost:9080/apporteurs/6797/ribs/1234" 
      } 
    } 

回答

3
@Override 
public RibResource toResource(Rib rib) { 
    return createResourceWithId(rib.getId(), rib); 
} 

createResourceWithId()內部創建基於控制器的URL自鏈接。在包含佔位符{idInt}您的情況,所以你就必須爲提供一個參數:

CustomUserDetails user = CurrentUserUtils.getCurrentUser(); 
return createResourceWithId(rib.getId(), rib, user.getIdInt()); 

更好的選擇將是不叫createResourceWithId()可言。只需將您現在在instantiateResource()中的所有內容移動到toResource()即可。

+0

OK !!!非常感謝,我從事這樣的解決方案,但不知道從哪裏開始:我看到「createResourceWithId」在Spring代碼中創建自連接,但在此之後創建「removeLinks」並非「乾淨」我的意見^^非常感謝,標記已解決;) – Tetragramato 2014-11-25 14:00:38