代码之家  ›  专栏  ›  技术社区  ›  VelNaga

spring boot hateoas转换hateoas链接到对象而不是集合

  •  0
  • VelNaga  · 技术社区  · 6 年前

    我用的是弹簧靴和Hateoas。我的一个api将hateoas链接公开为一个集合 “链接”: 相反,如果一个对象 “链接”:{ . 我不知道为什么它使用数组符号而不是对象。请在下面找到代码。任何帮助都将不胜感激。

    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"
             }
          ]
       }
    }
    

    预期产量

    {
       "id":"bookId",
       "BookInfo":{
          "bookUid":"bookUid",
          "_links":
             {
                "retrieve-book": {
                "href":"http://localhost/api/v1/book/bookId",
                "accepts":"application/json"
                }
             }
    
       }
    }
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   Gopi    6 年前

    我不能在评论中加入我的建议。因此,在此提及: 请参阅此: Embed object instead of collection in Spring HATEOAS

        2
  •  0
  •   uday kumar    6 年前

    这是因为您在代码中使用了list。

     @Override
     @JsonProperty("_links")
     @JsonInclude(JsonInclude.Include.NON_NULL)
     public List<Link> getLinks() {
        return super.getLinks();
     }
    

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

        3
  •  0
  •   Selindek    6 年前

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

    @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 从名单上。