gpt4 book ai didi

java - 具有许多变量的 Spring HATEOAS Resource Assembler 和 Resource Links

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:46:06 24 4
gpt4 key购买 nike

我正在使用 Spring HATEOAS 和 Spring 堆栈开发 REST API,我在资源链接方面遇到了一些问题。

这是我的代码:

Controller :

@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*/

}

如您所见,我的 Controller 在 URI 中有一些参数:idInt 和 idRib。

所以为了制作一个 SelfLink,我必须知道这个参数才能制作类似“/appporteurs/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"
}
}

最佳答案

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

createResourceWithId() 根据 Controller 的 URL 在内部创建一个自链接。在您的情况下包含占位符 {idInt} 因此您必须为此提供一个参数:

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

更好的选择是根本不调用 createResourceWithId()。只需将 instantiateResource() 中的所有内容移动到 toResource() 即可。

关于java - 具有许多变量的 Spring HATEOAS Resource Assembler 和 Resource Links,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27124961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com