Spring HATEOAS Resource Assembler和Resource Links包含许多变量
我正在使用Spring HATEOAS和Spring堆栈来处理REST API,并且我在链接到资源方面遇到了一些问题。
这是我的代码:
控制者:
@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 { 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] wsmmaResponseEntityExceptionHandler : 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" } }
@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()
。