我正在使用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的客户端实现?
答案 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
。