为了账号安全,请及时绑定邮箱和手机立即绑定

Spring-boot hatoas 将 hatoas 链接转换为对象而不是集合

Spring-boot hatoas 将 hatoas 链接转换为对象而不是集合

牧羊人nacy 2022-05-25 16:19:51
我正在使用 spring-boot 和 Hateoas。我的一个 API 将 hatoas 链接公开为集合"_links":[而不是对象"_links":{。我不确定为什么它使用数组表示法而不是对象。请在下面找到代码。任何帮助,将不胜感激。public class Book {    private String id;    private BookInfo bookInfo;}public class BookInfo extends ResourceSupport{    private String bookUid;    private String bookName;    private String authhorName;    private String bookGenre;    @Override    @JsonProperty("_links")    @JsonInclude(JsonInclude.Include.NON_NULL)    public List<Link> getLinks() {        return super.getLinks();    }}@RestController@RequestMapping(value = "/api/v1/", produces = APP_JSON)public class BookController {    @GetMapping("getBooks")    public ResponseEntity<Book> getTransactionStatus() {        Book book = bookRepo.getAllBooks();        book.getBookInfo().add(addLinks(book.getId()));        return ResponseEntity.ok().contentType(MediaType.valueOf(APP_JSON)).body(book);    }      public SuperLink getBookInfoLinks(String bookUid) {        return new SuperLink(                linkTo(methodOn(BookController.class).getBook(bookUid))                        .withRel("retrieve-book").expand(),APP_JSON);    }}public class SuperLink extends Link {    @XmlAttribute    @JsonInclude(JsonInclude.Include.NON_NULL)    private String accepts;    public SuperLink(Link link) {        super(link.getHref(), link.getRel());    }    public SuperLink(Link link, String accepts) {        super(link.getHref(), link.getRel());        this.accepts = accepts;    }    public String getAccepts() {        return accepts;    }    public void setAccepts(String accepts) {        this.accepts = accepts;    }}实际输出{   "id":"bookId",   "BookInfo":{      "bookUid":"bookUid",      "_links":[         {            "rel":"retrieve-book",            "href":"http://localhost/api/v1/book/bookId",            "accepts":"application/json"         }      ]   }}
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

我无法添加评论以包含我的建议。所以,在这里提一下:参考这个:Embed object instead of collection in Spring HATEOAS


查看完整回答
反对 回复 2022-05-25
?
HUH函数

TA贡献1836条经验 获得超4个赞

链接应序列化为地图,而不是列表。您可以自己将其转换为地图,也可以为此使用自定义序列化器/反序列化器。幸运的是 Spring 已经有了它们:


@Override

@JsonProperty("_links")

@JsonInclude(Include.NON_EMPTY)

@JsonSerialize(using = Jackson2HalModule.HalLinkListSerializer.class)

@JsonDeserialize(using = Jackson2HalModule.HalLinkListDeserializer.class)

public List<Link> getLinks() {

  return super.getLinks();

}

- - 编辑


为了使其工作,您将需要halJacksonHttpMessageConverter消息转换器列表中的 bean。创建一个WebMvcConfigurer并将其添加halJacksonHttpMessageConverter到方法中的转换器extendMessageConverters。


@Autowired

private HttpMessageConverter halJacksonHttpMessageConverter;


public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

  converters.add(halJacksonHttpMessageConverter);

}

您应该将其添加到列表的前面,或jacksonHttpMessageConverter从列表中删除原始文件。


查看完整回答
反对 回复 2022-05-25
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

发生这种情况是因为您在代码中使用了 List 。


 @Override

 @JsonProperty("_links")

 @JsonInclude(JsonInclude.Include.NON_NULL)

 public List<Link> getLinks() {

    return super.getLinks();

 }

您应该使用链接对象而不是链接列表。


查看完整回答
反对 回复 2022-05-25
  • 3 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信