无法使用@DBRef(lazy = true)-SDR注释属性

时间:2014-07-07 13:53:09

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

我可能会遗漏一些微不足道的东西,或者它是一个错误,我可以使用Spring Data Rest跟踪任何使用@DBRef(lazy = true)注释的属性作为我的实体对象。当我访问使用上述注释注释的属性时,我看到以下异常。

{
    "cause": null,
    "message": "Id must be assignable to Serializable! Object of class [null] must be an instance of interface java.io.Serializable" 
}

环境

  • Java - 7
  • Spring Data Rest - 2.1.1.RELEASE
  • Spring Data Mongo - 1.5.0.RELEASE
  • Tomcat - 7.x

更新1:

实体类:

@Document(collection = "people")
public class Employee {

    @Id
    private String id;

    @DBRef(lazy = true)
    private Employee manager;

    .... truncated getters/setters
}

这是stacktrace

13:57:47.092 [http-bio-8080-exec-4] ERROR o.s.d.r.w.AbstractRepositoryRestController - Id must be assignable to Serializable! Object of class [null] must be an instance of interface java.io.Serializable
java.lang.IllegalArgumentException: Id must be assignable to Serializable! Object of class [null] must be an instance of interface java.io.Serializable
    at org.springframework.util.Assert.isInstanceOf(Assert.java:337) ~[spring-core-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at org.springframework.data.rest.webmvc.support.RepositoryEntityLinks.linkToSingleResource(RepositoryEntityLinks.java:147) ~[spring-data-rest-webmvc-2.1.0.RELEASE.jar:na]
    at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.getSelfLinkFor(PersistentEntityResourceAssembler.java:88) ~[spring-data-rest-webmvc-2.1.0.RELEASE.jar:na]
    at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.toResource(PersistentEntityResourceAssembler.java:64) ~[spring-data-rest-webmvc-2.1.0.RELEASE.jar:na]
    at org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController$1.apply(RepositoryPropertyReferenceController.java:141) ~[spring-data-rest-webmvc-2.1.0.RELEASE.jar:na]
    at org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController$1.apply(RepositoryPropertyReferenceController.java:110) ~[spring-data-rest-webmvc-2.1.0.RELEASE.jar:na]
    at org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController.doWithReferencedProperty(RepositoryPropertyReferenceController.java:463) ~[spring-data-rest-webmvc-2.1.0.RELEASE.jar:na]
    at org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController.followPropertyReference(RepositoryPropertyReferenceController.java:148) ~[spring-data-rest-webmvc-2.1.0.RELEASE.jar:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_55]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_55]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_55]
    at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_55]
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) ~[spring-web-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) ~[spring-web-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) ~[spring-webmvc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685) ~[spring-webmvc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) ~[spring-webmvc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919) ~[spring-webmvc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) ~[spring-webmvc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) [spring-webmvc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844) [spring-webmvc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) [servlet-api.jar:na]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) [spring-webmvc-3.2.9.RELEASE.jar:3.2.9.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) [servlet-api.jar:na]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) [catalina.jar:7.0.50]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.50]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat7-websocket.jar:7.0.50]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [catalina.jar:7.0.50]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.50]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) [catalina.jar:7.0.50]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) [catalina.jar:7.0.50]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) [catalina.jar:7.0.50]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) [catalina.jar:7.0.50]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) [catalina.jar:7.0.50]
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) [catalina.jar:7.0.50]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) [catalina.jar:7.0.50]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409) [catalina.jar:7.0.50]
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044) [tomcat-coyote.jar:7.0.50]
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) [tomcat-coyote.jar:7.0.50]
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315) [tomcat-coyote.jar:7.0.50]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_55]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_55]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_55]

更新2

存储库

@RestResource(rel = "employees", path = "employees")
public interface EmployeeRepository extends
        PagingAndSortingRepository<Employee, String> {
}

WebConfiguration

public class WebApplicationInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    public static String CURIE_NAMESPACE = "reference";

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { ApplicationConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfiguration.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/api/*" };
    }

    @Configuration
    @Import({ RespositoryConfig.class })
    @ComponentScan(excludeFilters = @Filter({ Service.class,
            Configuration.class }))
    public static class WebConfiguration extends DelegatingWebMvcConfiguration {

        @Override
        protected void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new CorsInterceptor());
            super.addInterceptors(registry);
        }

    }

    @Configuration
    public static class RespositoryConfig extends
            RepositoryRestMvcConfiguration {

        @Override
        public RequestMappingHandlerMapping repositoryExporterHandlerMapping() {
            RequestMappingHandlerMapping mapping = super
                    .repositoryExporterHandlerMapping();
            mapping.setInterceptors(new Object[] { new CorsInterceptor() });
            return mapping;
        }

        @Override
        protected void configureJacksonObjectMapper(ObjectMapper objectMapper) {
            objectMapper.setSerializationInclusion(Include.NON_NULL);
            objectMapper.configure(
                    DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
        }

        @Override
        protected void configureRepositoryRestConfiguration(
                RepositoryRestConfiguration config) {
            config.exposeIdsFor(App.class, BusinessUnit.class, City.class,
                    Country.class, Employee.class, EmployeeTalentProfile.class,
                    Feed.class, Goc.class, ManagedGeography.class,
                    ManagedSegment.class);

        }
    }
}

请求http://localhost:8080/reference/api/employees/1010065136/manager

更新3:

RepositoryPropertyReferenceController s BeanWrapper.getProperty(prop)的第462行正在返回默认对象。进一步深入BeanWrapper代码行125 obj = ReflectionUtils.getField(field, bean)会返回LazyLoadingProxy。没有调用数据库来填充对象。

0 个答案:

没有答案