编辑 14/08/14 13:29

我的下一个结论是我的@RepositoryRestResource CrudRepository 生成的 hal+json 格式不正确。

教程 ( http://spring.io/guides/gs/accessing-data-rest/ ) 将超媒体 Rest JPA 实体的输出显示为:(请注意没有“rel”元素,并且“links”不是数组)

{
   "_links" : {
       "people" : {
           "href" : "http://localhost:8080/people{?page,size,sort}"
       }
   }
 }

但是,引用文档( http://docs.spring.io/spring-data/rest/docs/1.1.x/reference/html/intro-chapter.html )显示输出应该是:
{
    "links" : [ {
        "rel" : "customer",
        "href" : "http://localhost:8080/customer"
      }, {
         "rel" : "profile",
         "href" : "http://localhost:8080/profile"
      }
 }

有人知道为什么吗?

======================================

14 年 8 月 14 日编辑:我的调试更进了一步。通过提供我自己的 org.springframework.hateoas.ResourceSupport 类实现,它检查 json 中的“_links”而不是“links”,我更进一步。错误是:



这是因为 org.springframework.hateoas.ResourceSupport 类似乎要求 links 属性是一个 json 数组。默认情况下,Spring Data 为 Rest Entity 生成的 json+hal 输出不会生成数组(没有方括号):
"_links" : {
  "self" : {
    "href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/Fxxx"
  },
  "solicitors" : {
    "href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/Fxxx/solicitor
  }
}

希望来自 Spring 论坛的人可以在这里帮助我。

==============================================

请查看我的 Spring Data 存储库代码的大纲:
@RepositoryRestResource
    public interface SolicitorFirmRepository extends CrudRepository<SolicitorFirm, String> {
}

@Entity
@RestResource
@Table(name="XXXX", schema = "XXX")
public class SolicitorFirm implements Serializable {
}

这成功地生成了以下 hatoas 资源:
{
"firmNumber" : "FXXXX",
"solicitorType" : "r",
"companyName" : "XXXX",
"address1" : "XXXX",
"address2" : "XXX",
"address3" : "XXX",
"address4" : null,
"phoneNumber" : "XXXXX",
"faxNumber" : "XXXXX",
"county" : "OY",
"_links" : {
    "self" : {
        "href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/XXXX"
    },
    "solicitors" : {
        "href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/XXXX/solicitors"
    }
 }

但是,当我为客户端/ Controller 使用定义 DTO 时:
import org.springframework.hateoas.ResourceSupport;
public class SolicitorFirmDTO extends ResourceSupport {
   .....
}

并使用以下代码
RestTemplate rt = new RestTemplate();
String uri = new String("//xxxxx:9090/solas-admin-data-api/solicitors/Sxxxxx");
SolicitorFirmDTO u = rt.getForObject(uri, SolicitorFirmDTO.class, "SXXXX");

我收到以下错误:



出于某种原因,Spring Data Rest 生成的 json 在 _links 下添加了实体链接,而 HATEOAS 资源父类(super class)需要 links

任何人都可以帮忙吗?这是版本问题还是我需要一些额外的配置来将 _links 映射到 links
我尝试过 MappingJackson2HttpMessageConverter 和各种媒体类型 application/json+hal 都无济于事。

最佳答案

对于 Spring-boot 1.3.3, 列表 的方法 exchange() 正在工作

public void test1() {

    RestTemplate restTemplate = restTemplate();

    ParameterizedTypeReference<PagedResources<User>> responseTypeRef = new ParameterizedTypeReference<PagedResources<User>>() {
    };

    String API_URL = "http://localhost:8080/api/v1/user"
    ResponseEntity<PagedResources<User>> responseEntity = restTemplate.exchange(API_URL, HttpMethod.GET,
            (HttpEntity<User>) null, responseTypeRef);

    PagedResources<User> resources = responseEntity.getBody();
    Collection<User> users = resources.getContent();
    List<User> userList = new ArrayList<User>(users);

    System.out.println(userList);

}

private RestTemplate restTemplate() {

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.registerModule(new Jackson2HalModule());

    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json"));
    converter.setObjectMapper(mapper);

    List<HttpMessageConverter<?>> converterList = new ArrayList<HttpMessageConverter<?>>();
    converterList.add(converter);
    RestTemplate restTemplate = new RestTemplate(converterList);

    return restTemplate;
}

10-06 05:13
查看更多