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

我正在使用 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"

         }

      ]

   }

}


牧羊人nacy
浏览 149回答 3
3回答

慕的地10843

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

HUH函数

链接应序列化为地图,而不是列表。您可以自己将其转换为地图,也可以为此使用自定义序列化器/反序列化器。幸运的是 Spring 已经有了它们:@Override@JsonProperty("_links")@JsonInclude(Include.NON_EMPTY)@JsonSerialize(using = Jackson2HalModule.HalLinkListSerializer.class)@JsonDeserialize(using = Jackson2HalModule.HalLinkListDeserializer.class)public List<Link> getLinks() {&nbsp; return super.getLinks();}- - 编辑为了使其工作,您将需要halJacksonHttpMessageConverter消息转换器列表中的 bean。创建一个WebMvcConfigurer并将其添加halJacksonHttpMessageConverter到方法中的转换器extendMessageConverters。@Autowiredprivate HttpMessageConverter halJacksonHttpMessageConverter;public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {&nbsp; converters.add(halJacksonHttpMessageConverter);}您应该将其添加到列表的前面,或jacksonHttpMessageConverter从列表中删除原始文件。

眼眸繁星

发生这种情况是因为您在代码中使用了 List 。&nbsp;@Override&nbsp;@JsonProperty("_links")&nbsp;@JsonInclude(JsonInclude.Include.NON_NULL)&nbsp;public List<Link> getLinks() {&nbsp; &nbsp; return super.getLinks();&nbsp;}您应该使用链接对象而不是链接列表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java