Spring-boot hateoas конвертирует ссылки hateoas в объект вместо коллекции - PullRequest
0 голосов
/ 29 января 2019

Я использую пружинный ботинок вместе с Hateoas.Один из моих API предоставляет ссылки на hateoas в виде коллекции "_ 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"
            }
         }

   }
}

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Это происходит потому, что вы используете List в вашем коде.

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

Вы должны использовать объект Link вместо List of Link.

0 голосов
/ 30 января 2019

Ссылки должны быть сериализованы как карта, а не как список.Вы можете либо конвертировать его в карту самостоятельно, либо использовать для этого собственный сериализатор / десерализатор.К счастью, у 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();
}

--- edit

Для того, чтобы это заработало, вам потребуется компонент halJacksonHttpMessageConverter в списке конвертеров сообщений.Создайте WebMvcConfigurer и добавьте halJacksonHttpMessageConverter к конвертерам в методе extendMessageConverters.

@Autowired
private HttpMessageConverter halJacksonHttpMessageConverter;

public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
  converters.add(halJacksonHttpMessageConverter);
}

Вы должны добавить его в начало списка или удалить исходный jacksonHttpMessageConverter изсписок.

0 голосов
/ 29 января 2019

Я не могу добавить комментарий, чтобы включить мое предложение.Итак, упомянув об этом здесь: Ссылка на это: Вставить объект вместо коллекции в Spring HATEOAS

...