繁体   English   中英

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

[英]NPE in ResourceProcessorHandlerMethodReturnValueHandler when registering Resource Processor

我创建了一个自定义存储库,并希望它按照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 Proxy对象上强制转换为Class时存在问题。

这是发生NPE的代码的ResourceProcessorHandlerMethodReturnValueHandler中的行:

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

我的问题是如何避免NPE?

需要注意的另一件事是,由于我在仅支持Servlet 2.5的WebLogic服务器上运行Application,因此我尝试使用xml和Java配置Spring。 这是我的配置摘录。 我想我在这里做错了什么:

我的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
{

我找到了根本原因。

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

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

因此,当我删除它时,一切都很好。 我还尝试添加proxy-target-class =“ true”强制CGLIB,但是然后我在同一位置出现了堆栈溢出异常???

不确定如何将AOP与SDR处理器结合起来吗? 有任何想法吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM