Java Spring HATEOAS资源汇编程序和具有多个变量的资源链接
我正在使用SpringHateOAS和Spring堆栈开发RESTAPI,在链接到资源时遇到了一些问题 这是我的密码: 控制器:Java Spring HATEOAS资源汇编程序和具有多个变量的资源链接,java,spring,rest,hateoas,spring-hateoas,Java,Spring,Rest,Hateoas,Spring Hateoas,我正在使用SpringHateOAS和Spring堆栈开发RESTAPI,在链接到资源时遇到了一些问题 这是我的密码: 控制器: @RestController @RequestMapping("/apporteurs/{idInt}/ribs") public class RibController { @Autowired private RibResourceAssembler ribResourceAssembler; @Autowired priva
@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*/
}
汇编程序:
@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中有一些参数:IDIT和idRib
因此,对于make-SelfLink,我必须知道make的参数,比如“/apporters/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上看到了一些东西,但我没有使用SpringDataREST
你能帮我吗?先谢谢你;)
编辑:
结果应该是:
_links": {
"editiqueMandat": {
"href": "http://localhost:9080/apporteurs/6797/mandats/5822"
},
"self": {
"href": "http://localhost:9080/apporteurs/6797/ribs/1234"
}
}
createResourceWithId()
根据控制器的URL在内部创建一个自链接。在您的示例中,包含占位符{idInt}
,因此您必须为此提供一个参数:
CustomUserDetails user = CurrentUserUtils.getCurrentUser();
return createResourceWithId(rib.getId(), rib, user.getIdInt());
更好的选择是根本不调用
createResourceWithId()
。只需将您现在在instantiateResource()
中拥有的所有内容移动到toResource()
确定!!!非常感谢,我研究了这样一个解决方案,但不知道从哪里开始:我看到“CreateSourceWithId”在Spring代码中创建了自链接,但在我看来,在这之后创建了一个“removeLinks”^^非常感谢,mark resolved;)