Spring Cloud FeignClient解码应用程序/ hal + json资源<object>返回类型

时间:2015-06-11 18:49:35

标签: spring-data-rest spring-cloud spring-hateoas

我正在使用Spring Cloud,Spring Data JPA,Spring Data Rest和Spring Boot开发REST API。服务器实现根据HAL规范等正确生成各种数据项。它生成HAL + JSON,如下所示:

{
  "lastModifiedBy" : "unknown",
  "lastModifiedOn" : "2015-06-04T12:19:45.249688",
  "id" : 2,
  "name" : "Item 2",
  "description" : null,
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/pltm/accounts/2"
    },
    "customers" : {
      "href" : "http://localhost:8080/pltm/accounts/2/customers"
    },
    "users" : {
      "href" : "http://localhost:8080/pltm/accounts/2/users"
    },
    "groups" : {
      "href" : "http://localhost:8080/pltm/accounts/2/groups"
    }
  }
}

现在我正在尝试使用FeignClient Spring Cloud库来实现客户端实现。我已按如下方式定义了我的客户端界面。

@FeignClient("serviceId")
@RequestMapping(value = "/api", consumes = MediaType.APPLICATION_JSON_VALUE)
public interface PltmClient
{
  // Account Requests
  @RequestMapping(method = RequestMethod.GET, value = "/accounts")
  PagedResources<Resource<Account>> getAccounts();

  @RequestMapping(method = RequestMethod.GET, value = "/accounts/{id}")
  Resource<Account> getAccountAsResource(@PathVariable("id") Long id);

  @RequestMapping(method = RequestMethod.GET, value = "/accounts/{id}")
  Account getAccount(@PathVariable("id") Long id);
}

当我调用getAccout()方法时,我会使用JSON文档中的详细信息返回我的域对象Account。那个对象是一个简单的POJO。所有字段都填写正确。

public class Account
{
   private Long id;
   private String name;
   private String description;

   /** Setters/Getters left out for brevity **/
 }

但是当我调用getAccountAsResource()时,它会起作用,我会找回一个包含数据的Resource对象。但是,对Resource.getContent()的调用会返回一个未完全填写的Account对象。在这种情况下,Account.getId()为NULL,这会导致问题。

为什么会发生这种情况?我有一个想法是Resource类定义了一个getId()方法,这在某种程度上混淆了Jackson ObjectMapper。

更大的问题是,这整个方法是否可行还是有更好的方法?显然,我可以使用普通的POJO作为我的返回类型,但这会丢失客户端的HAL信息。

是否有人为Spring Data REST服务器端点成功实现了基于Java的客户端实现?

1 个答案:

答案 0 :(得分:0)

Account没有id是spring-data-rest的一个特性。您需要在服务器端启用id的填充。

我还添加了一个不同的方法来返回id(在Account中)

@JsonProperty("accountId")
public String getId() {
    return id;
}

启用ID

@Configuration
public class MyConfig extends RepositoryRestMvcConfiguration {

    @Override
    protected void configureRepositoryRestConfiguration( RepositoryRestConfiguration config) {
        config.exposeIdsFor(Account.class);
    }
}

我在这里使用过它:https://github.com/spencergibb/myfeed,虽然我相信我在哪里使用资源,但我使用的是RestTemplate