5

Tôi đang sử dụng mô hình bên:Làm thế nào để cấu hình một RelProvider tùy chỉnh cho Spring HATEOAS khi sử dụng Spring Boot?

@Entity 
@Inheritance(strategy=...) 
@JsonTypeInfo(use= JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") 
@DiscriminatorColumn(name = "type") 
public abstract class Party { 

    @Column(updatable = false, insertable = false) 
    private String type; 

    ... 
} 

@Entity 
public class Individual extends Party { 
    ... 
} 

@Entity class Organization extends Party { 
    ... 
} 

mùa xuân dữ liệu REST của phản ứng như thế này:

{ 
    "_embedded": { 
    "organizations": [ 
     { 
     "type":"Organization", 
     "name": "Foo Enterprises", 
     "_links": { 
      "self": { 
      "href": "http://localhost/organization/2" 
      }, 
      "organization": { 
      "href": "http://localhost/organization/2" 
      } 
     } 
     } 
    ], 
    "individuals": [ 
     { 
     "type":"Individual", 
     "name": "Neil M", 
     "_links": { 
      "self": { 
      "href": "http://localhost/individual/1" 
      }, 
      "individual": { 
      "href": "http://localhost/individual/1" 
      } 
     } 
     } 
    ] 
    } 
} 

Nhưng tôi cần nó để đáp ứng như thế này:

{ 
    "_embedded": { 
    "parties": [ 
     { 
     "type": "Organization", 
     "name": "Foo Enterprises", 
     "_links": { 
      "self": { 
      "href": "http://localhost/party/2" 
      }, 
      "organization": { 
      "href": "http://localhost/party/2" 
      } 
     } 
     }, 
     { 
     "type": "Individual", 
     "name": "Neil M", 
     "_links": { 
      "self": { 
      "href": "http://localhost/party/1" 
      }, 
      "individual": { 
      "href": "http://localhost/party/1" 
      } 
     } 
     } 
    ] 
    } 
} 

Để làm như vậy , Tôi hiểu tôi need to provide a custom RelProvider:

@Order(Ordered.HIGHEST_PRECEDENCE) 
@Component 
public class MyRelProvider implements RelProvider { 

    public MyRelProvider() {} 

    @Override 
    public String getItemResourceRelFor(Class<?> aClass) { 
     return "party"; 

    } 

    @Override 
    public String getCollectionResourceRelFor(Class<?> aClass) { 
     return "parties"; 
    } 

    @Override 
    public boolean supports(Class<?> aClass) { 
     return aClass.isAssignableFrom(Party.class); 
    } 
} 

tôi đã cố gắng cấu hình nó trong Application.java:

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    RelProvider myRelProvider() { 
     return new MyRelProvider(); 
    } 
} 

này không hoạt động mặc dù. Có vẻ như không được đăng ký hoặc đăng ký chính xác. Xem http://andreitsibets.blogspot.ca/2014/04/hal-configuration-with-spring-hateoas.html

Làm cách nào để khắc phục sự cố này?

Trả lời

0

Bạn đã chú thích các lớp điều khiển của bạn với @ExposesResourceFor

Từ spring hateos docs

  1. SPIs

3,1. RelProvider API

Khi xây dựng liên kết, bạn thường cần xác định loại quan hệ sẽ được sử dụng> cho liên kết. Trong hầu hết các trường hợp, loại quan hệ được liên kết trực tiếp với một loại (tên miền). Chúng tôi gói gọn thuật toán chi tiết để tra cứu các loại quan hệ đằng sau một API RelProvider cho phép xác định các loại quan hệ cho các tài nguyên đơn và tập hợp. Dưới đây là thuật toán loại quan hệ được tìm kiếm:

  1. Nếu loại được chú thích với @Relation chúng tôi sử dụng các giá trị được định cấu hình trong chú thích.

  2. nếu không, chúng tôi đặt mặc định cho tên lớp đơn giản không có quỹ đầu vào cộng với Danh sách được thêm vào cho tập hợp rel.

  3. trong trường hợp JAR inflector JAR nằm trong đường dẫn lớp, chúng tôi sử dụng số nhiều của tài nguyên đơn lẻ được cung cấp bởi thuật toán số nhiều.

  4. lớp @Controller chú thích với @ExposesResourceFor (xem EntityLinks để biết chi tiết) sẽ minh bạch tra cứu các loại liên quan cho các loại cấu hình trong chú thích, vì vậy mà bạn có thể sử dụng relProvider.getSingleResourceRelFor (MyController.class) và nhận được các loại liên quan của loại miền được hiển thị.

Một nhà cung cấp dịch vụ được tiếp xúc dưới dạng Spring bean khi sử dụng @EnableHypermediaHỗ trợ tự động. Bạn có thể cắm vào các nhà cung cấp tùy chỉnh bằng cách đơn giản thực hiện giao diện và hiển thị chúng dưới dạng bean Spring lần lượt.

+0

lớp điều khiển nào? Đây là Spring Data REST –

+0

trên giao diện của bạn có chú thích @RepositoryRestResource – stringy05

0

Tôi có cùng vấn đề và có giải pháp bẩn trong trường hợp bạn quan tâm.Thực hiện các kho riêng cho lớp con như

@RepositoryRestResource(path = "parties")  
interface IndividualRepository extends PagingAndSortingRepository<Individual, Long>{ 
} 

Hy vọng rằng sẽ cung cấp cho bạn một số cứu trợ tạm thời.

+0

Tôi sẽ dùng thử. cám ơn –

Các vấn đề liên quan