【问题标题】:Spring-boot hateoas convert hateoas links to object instead of collectionSpring-boot hatoas 将 hatoas 链接转换为对象而不是集合
【发布时间】:2019-01-29 17:54:13
【问题描述】:

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

预期输出

{
   "id":"bookId",
   "BookInfo":{
      "bookUid":"bookUid",
      "_links":
         {
            "retrieve-book": {
            "href":"http://localhost/api/v1/book/bookId",
            "accepts":"application/json"
            }
         }

   }
}

【问题讨论】:

    标签: java spring spring-boot spring-hateoas hateoas


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        链接应序列化为地图,而不是列表。您可以自己将其转换为地图,也可以为此使用自定义序列化器/反序列化器。幸运的是 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

        【讨论】:

        • 嗨 Selindek...使用序列化程序后出现以下异常....com.fasterxml.jackson.databind.JsonMappingException: Class org.springframework.hateoas.hal.Jackson2HalModule$HalLinkListSerializer 没有默认值(没有arg) 构造函数
        猜你喜欢
        • 2016-10-17
        • 2017-03-02
        • 1970-01-01
        • 2015-06-07
        • 2015-06-06
        • 1970-01-01
        • 2020-12-18
        • 2019-11-27
        • 1970-01-01
        相关资源
        最近更新 更多