资源链接rel与id spring数据休息

时间:2017-06-20 01:30:17

标签: spring spring-data spring-data-rest

拥有以下实体和存储库。我无法将id放在我的关系上。在此先感谢您的帮助

我的build.gradle中的相关工件(使用Spring Boot版本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中没有省ID

{
 "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.LAZY 上将EAGER更改为Store,因为尝试时出错

"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

1 个答案:

答案 0 :(得分: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;
            }
        };
    }
}
相关问题