[英]Spring Data Rest Adding Link to Root - RepositoryLinksResource cannot be cast to Resource
我試圖在我的API的根文檔中添加一個自定義鏈接,遵循以下答案: 在Spring REST HATEOAS中使用RepositoryRestResource-s和常規控制器對root請求進行自定義響應
這是我的自定義資源處理器:
import org.springframework.data.rest.webmvc.RepositoryLinksResource;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.ResourceProcessor;
import org.springframework.hateoas.mvc.ControllerLinkBuilder;
import org.springframework.stereotype.Component;
@Component
public class CustomRootLinksResourceProcessor implements ResourceProcessor<RepositoryLinksResource> {
@Override
public RepositoryLinksResource process(RepositoryLinksResource resource) {
Link link = ControllerLinkBuilder
.linkTo(ControllerLinkBuilder
.methodOn(CustomerController.class)
.register(null))
.withRel("registerCustomer");
resource.add(link);
return resource;
}
}
但是,當我查詢我的API時,我收到以下異常
LOGBACK:19:01:03.425 [http-nio-8080-exec-2] ERROR o.s.d.r.w.RepositoryRestExceptionHandler - org.springframework.data.rest.webmvc.RepositoryLinksResource cannot be cast to org.springframework.hateoas.Resource
java.lang.ClassCastException: org.springframework.data.rest.webmvc.RepositoryLinksResource cannot be cast to org.springframework.hateoas.Resource
at org.springframework.hateoas.mvc.ResourceProcessorInvoker$DefaultProcessorWrapper.invokeProcessor(ResourceProcessorInvoker.java:224)
at org.springframework.hateoas.mvc.ResourceProcessorInvoker.invokeProcessorsFor(ResourceProcessorInvoker.java:141)
at org.springframework.hateoas.mvc.ResourceProcessorInvoker.invokeProcessorsFor(ResourceProcessorInvoker.java:124)
at org.springframework.hateoas.mvc.ResourceProcessorHandlerMethodReturnValueHandler.handleReturnValue(ResourceProcessorHandlerMethodReturnValueHandler.java:113)
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
我不確定我在這里做錯了什么,因為檢查ResourceProcessorInvoker的源代碼它出現了只有一個轉換為ResourceSupport
( RepositoryLinksResource
擴展,所以應該沒問題)。 這是Spring數據休息中的錯誤還是我的CustomRootLinksResourceProcessor
有問題?
@Override
@SuppressWarnings("unchecked")
public Object invokeProcessor(Object object) {
return ((ResourceProcessor<ResourceSupport>) processor).process((ResourceSupport) object);
}
正如Sam所提到的那樣(並且都歸功於他) “ 我認為ResourceProcessor實現不能像文檔中那樣成為lambda ”
我無法在文檔中找到確切的參考,但這是一個例子,以防萬一其他人在解決這個問題。
這有效:
@Bean
public ResourceProcessor<Resource<Invoice>> processor() {
return new ResourceProcessor<Resource<Invoice>>() {
@Override
public Resource<Invoice> process(Resource<Invoice> resource) {
resource.add(entityLinks.linkToSingleResource(Invoice.class, 1));
return resource;
}
};
}
但這不是:
@Bean
public ResourceProcessor<Resource<Invoice>> processor() {
return (Resource<Invoice> resource) -> {
resource.add(entityLinks.linkToSingleResource(Invoice.class, 1));
return resource;
};
}
所以我在調試器中逐步完成了SDR代碼,事實證明異常是由另一個ResourceProcessor
的調用引起的,如下所示:
@Component
public class CustomerResourceProcessorWrapper {
@Bean
public ResourceProcessor<Resource<Customer>> customerResourceProcessor() {
我仍然是Spring Data Rest的新手,所有這些都是反射魔法,但用straigt ResourceProcessor
替換錯誤的CustomerResourceProcessorWrapper
聲明為我解決了這個問題:
@Component
public class CustomerResourceProcessor implements ResourceProcessor<Resource<Customer>> {
@Override
public Resource<Customer> process(Resource<Customer> resource) {
...
我仍然想知道這個包裝器是什么以及為什么它不起作用...使用CustomerResourceProcessorWrapper
的相同代碼工作正常,除非我添加CustomRootLinksResourceProcessor
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.