2017-06-20 76 views
0

具有以下实体和存储库。我无法设法把我的关系放在身份证上。在此先感谢您的帮助资源链接rel与ID弹簧数据休息

从我的构建相关artifacts。gradle这个(使用Spring引导版本1.5.4.RELEASE

compile('org.springframework.boot:spring-boot-starter-data-jpa') 
compile('org.springframework.boot:spring-boot-starter-data-rest') 

实体

商店

@Entity 
@Table(name = "store") 
class Store { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    long id 

    String description 

    @ManyToOne(optional=false, fetch = FetchType.EAGER) 
    Province province 
} 

@Entity 
@Table(name = "province") 
class Province { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    long id 

    @NotNull 
    String name 
} 

商店

@RepositoryRestResource(collectionResourceRel = "stores", path = "stores") 
interface StoreRepository extends PagingAndSortingRepository<Store, Long> { 
} 

@RepositoryRestResource(collectionResourceRel = "provinces", path = "provinces") 
interface ProvinceRepository extends PagingAndSortingRepository<Province, Long> { 
} 

预期结果 我期待这样的结果,请注意链接省

{ 
"stores": [ 
    { 
    "id": 1, 
    "description": "desc1", 
    "_links": { 
     "self": { 
     "href": "http://localhost:8080/stores/1" 
     }, 
     "store": { 
     "href": "http://localhost:8080/stores/1" 
     }, 
     "province": { 
     "href": "http://localhost:8080/stores/1/province/1" ==> Expecting the url with provinceID since its many to one 
     } 
    } 
    } 
] 
    //Simplified for simplicity sake 
} 

实际结果 不具有省标识在HREF

{ 
"stores": [ 
    { 
    "id": 1, 
    "description": "desc1", 
    "_links": { 
     "self": { 
     "href": "http://localhost:8080/stores/1" 
     }, 
     "store": { 
     "href": "http://localhost:8080/stores/1" 
     }, 
     "province": { 
     "href": "http://localhost:8080/stores/1/province" ==> //NO ID! 
     } 
    } 
    } 
] 
    //Simplified for simplicity sake 
} 

基本上我期待

"province": { 
      "href": "http://localhost:8080/stores/1/province/1" ==> Expecting the url with provinceID since its many to one 
      } 

,而不是这个

"province": { 
    "href": "http://localhost:8080/stores/1/province" //NO province ID 
    } 

编辑6月21日在11:54 我已经改变了FetchType.LAZYEAGERStore因t时出错rying做

"http://localhost:8080/stores/1/province/1" 

GOT

"org.springframework.http.converter.HttpMessageNotWritableException", 
    "message": "Could not write JSON: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer 
+0

该问题可能是@ManyToOne,因为链接存储在Province表中而不是Store表。但我很诚实:我从来没有见过这个问题。 – benkuly

回答

0

最后我已经发现了两个候选条件的方式来解决这一使用ResourceProcessor预测和其他。希望这有助于某人。

Projections

@Projection(name="storeProjection", types={Store.class}) 
interface StoreProjection { 

    long getId(); 
    String getDescription(); 
    String getPhoneNumber(); 
    StoreStatus getStatus(); 

    @Value("#{target.province.id}") 
    Long getProvinceId(); 

    @Value("#{target.province.name}") 
    String getProvinceName(); 
} 

GET http://localhost:8080/stores?projection=storeProjection

JSON结果

{ 
    //Store data... 

    "provinceId": "1" 
    "provinceName": "Prov1" 

//Links,etc data 
} 

ResourceProcessor为了增加与所需信息的新链接

@Configuration 
class ResourcesProcessors { 

    @Autowired 
    EntityLinks entityLinks 

    @Bean 
    public ResourceProcessor<Resource<Store>> storeProcessor() { 

     return new ResourceProcessor<Resource<Store>>() { 
      @Override 
      public Resource<Store> process(Resource<Store> resource) { //Este punto solo se agregan nuevos links 

       Store store = resource.getContent() 
       Link link = entityLinks.linkToSingleResource(Province.class, store.province.id); 
       resource.add(link); 
       return resource; 
      } 
     }; 
    } 
}