2015-10-21 47 views
1

香草实体用户 -为什么Spring HATEOAS返回导致JSON反序列化异常的重复链接?

public class User implements Serializable { 
    private static final long serialVersionUID = 262950482349139355L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "FIRST_NAME", nullable = false, unique = false) 
    @Convert(converter = NameConverter.class) 
    private String firstName; 

    @Column(name = "LAST_NAME", nullable = false, unique = false) 
    @Convert(converter = NameConverter.class) 
    private String lastName; 

    @Column(name = "PHONE_NUM", nullable = false, unique = false) 
    @Convert(converter = PhoneNumberConverter.class) 
    private String phoneNum; 

    @Column(name = "EMAIL", nullable = true, unique = false) 
    @Convert(converter = OptionalStringConverter.class) 
    private Optional<String> email; 
} 

搜索与主机名导致URL变了 - 现在

{ 
    "_links" : { 
    "self" : { 
     "href" : "http://hostname/users/search/findByLastName?lastName=doe{&page,size,sort}", 
     "templated" : true 
    } 
    }, 
    "_embedded" : { 
    "users" : [ { 
     "firstName" : "John", 
     "lastName" : "Doe", 
     "phoneNum" : "111-111-1111", 
     "email" : null, 
     "_links" : { }, 
     "_embedded" : { }, 
     "_links" : { 
     "self" : { 
      "href" : "http://hostname/users/1", 
      "templated" : false 
     } 
     } 
    } ] 
    }, 
    "page" : { 
    "size" : 20, 
    "totalElements" : 1, 
    "totalPages" : 1, 
    "number" : 0 
    } 
} 

编辑 2个_links:

重复的链接不存在,当资源访问它自己的。但是,当客户(我的情况下是一个微服务)使用RestTemplate发出请求时,响应会返回2 _links,如上所示。我使用Spring Data JPA,Spring Data Rest,Spring HATEOAS和Spring Cloud。我使用Spring Data JPA,Spring Data Rest,Spring HATEOAS和Spring Cloud。这是我的Github上的link to the project

完全披露:我已经在Spring HATEOAS Github上提交了一个问题。

+0

请告诉我们你的代码,你组装的资源。实体和预期的结果是不够的。我们在自己的软件中做了一个非常类似的事情,它很有用。 –

+0

@ThomasUhrig我不组装资源。我正在使用Spring JPA为我做这件事。我已经更新了我的帖子,澄清了这一点,并提供了一段代码链接。 –

+0

我不想通过你的GitHub仓库来修复你的东西。请发布相关代码。实体和结果在这种情况下不相关。如果我会浏览你的回购 - 理论上 - 我会说你用一个'PersistentEntityResourceAssembler'在你的控制器中组装你的资源。但是在你做之前,你会手动链接到UserSearchResult。所以,是的,你组装的资源,你做错了。所以显示代码。 –

回答

0

首先,您使用的不仅仅是spring-hateoas的spring-data-rest。所以你没有资源和控制器。我认为这是这里的主要误解。

我认为你的自定义存储库有问题。从UserRepositoryCustomImpl

  • 删除@Repository
  • 化妆UserRepository延长UserRepositoryCustom

所以

public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom 

我会改变两件事

public class UserRepositoryCustomImpl implements UserRepositoryCustom 

这是你需要,以实现自定义库的方法是什么:

又见http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-implementations

+0

我没有使用'UserRepositoryCustom',我最初提出这个想法,但没有最终使用它。 UserRepository'只是扩展'JpaRepository' '公共接口UserRepository扩展JpaRepository {...}' –

+1

我确认UserRepositoryCustom与这个问题无关(通过删除UserRepositoryCustom)。我在帖子中添加了更多信息。 –

相关问题