2017-04-15 27 views
1

我想自定義鏈接添加到我的API的根文件,以下這個答案: Custom response for root request int the Spring REST HATEOAS with both RepositoryRestResource-s and regular controllers春數據休息添加鏈接根 - RepositoryLinksResource不能轉換爲資源

這是我的自定義資源處理器:

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擴展,所以它應該沒問題)。這是春季數據休息的錯誤還是我的CustomRootLinksResourceProcessor有什麼問題?

@Override 
    @SuppressWarnings("unchecked") 
    public Object invokeProcessor(Object object) { 
     return ((ResourceProcessor<ResourceSupport>) processor).process((ResourceSupport) object); 
    } 

回答

2

所以我通過在調試器中SDR代碼加強和事實證明,這個例外是由另一ResourceProcessor調用,看起來像這樣造成的:

@Component 
public class CustomerResourceProcessorWrapper { 
    @Bean 
    public ResourceProcessor<Resource<Customer>> customerResourceProcessor() { 

我還是相當新春天數據休息和它所有的反射魔法,而是用straigt ResourceProcessor更換有故障的CustomerResourceProcessorWrapper聲明固定我的問題:

@Component 
public class CustomerResourceProcessor implements ResourceProcessor<Resource<Customer>> { 

    @Override 
    public Resource<Customer> process(Resource<Customer> resource) { 
    ... 

我仍然很想知道這個包裝的東西是什麼,爲什麼沒有工作... 使用CustomerResourceProcessorWrapper相同的代碼工作正常,除非我添加CustomRootLinksResourceProcessor

+1

我覺得'ResourceProcessor'實現**不能是lambda **,就像在[docs]中一樣(https://docs.spring.io/spring-data/rest/docs/2.6.9.RELEASE/reference/HTML /#_ the_resourceprocessor_interface)。這爲我解決了它。 – Sam