注册资源处理器时,ResourceProcessorHandlerMethodReturnValueHandler中的NPE

时间:2014-08-03 22:46:00

标签: java spring spring-mvc spring-data spring-data-rest

我已经创建了一个自定义存储库,我想让它在Spring-restbucks示例之后注册Spring Data Rest存储库。

@RestController
public class BuildingController implements ResourceProcessor<RepositoryLinksResource> {
    public static final String PAGES_REL = "pages";
    @Autowired(required=true)
    public BuildingController(BuildingRepository repository) {
        Assert.notNull(repository);
        this.repository = repository;
    }

    private final BuildingRepository repository;

当我在应用程序的其余部分部署它时,我在ResourceProcessorHandlerMethodReturnValueHandler ctor中获得NPE。 在调试过程中,我注意到我拥有的所有其他处理器都是regualr java对象,只有BuildingController一个是com.sun.proxy。$ Proxy ... 因此问题在于在JDK代理对象上转换为Class。

以下是NPE发生的代码的ResourceProcessorHandlerMethodReturnValueHandler中的行:

TypeInformation<?> componentType = from(processor.getClass()).getSuperTypeInformation(ResourceProcessor.class)
                .getComponentType();
Class<?> rawType = componentType.getType();

我的问题是如何避免NPE?

还有一点要注意的是,我正在尝试使用xml和Java配置Spring,因为我在WebLogic服务器上运行Application,它只支持servlet 2.5。 以下是我的配置的摘录。我想我在这里做错了什么:

我的web.xml

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
    /WEB-INF/spring/root-context.xml
    /WEB-INF/spring/spring-security.xml
    /WEB-INF/spring/appServlet/servlet-context.xml
   </param-value>
 </context-param>
 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
<servlet>
  <servlet-name>appServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
  </init-param>
 <load-on-startup>1</load-on-startup>
 </servlet>

servlet的context.xml中

<context:component-scan base-package="com.my.app, org.springframework.security"/>

然后我创建了java配置

@Configuration
@ComponentScan( "com.my.app.platform" )
@EnableWebMvc

@EnableHypermediaSupport( type = EnableHypermediaSupport.HypermediaType.HAL )
public class WebMvcConfiguration extends RepositoryRestMvcConfiguration
{

1 个答案:

答案 0 :(得分:0)

我找到了根本原因。

在servlet-contect.xml中我也配置了aop

 <aop:aspectj-autoproxy >
   <aop:include name="loggingAspect"/>
 </aop:aspectj-autoproxy>

所以当我删除它时,一切都很好。 我还尝试添加proxy-target-class =&#34; true&#34;强迫CGLIB但是我在同一个地方有堆栈溢出异常???

不确定如何将AOP与SDR处理器相结合? 有什么想法吗?