【问题标题】:Trying to Autowire a Spring Data MongoRepository in Struts2尝试在 Struts2 中自动装配 Spring Data MongoRepository
【发布时间】:2015-03-30 00:49:46
【问题描述】:

我正在学习 Struts 2 框架(只是为了好玩 :))并且我想使用 Spring Data 框架将我的 Web 应用程序连接到 MongoDB 后端。现在通常我只是创建一个扩展 MongoRepository 的存储库,然后我将它自动装配到我的应用程序中,就是这样。

但是,这次这样做效果并不好。我不断收到 NullPointerExceptions,这意味着我的存储库没有自动装配。有谁知道出了什么问题?

编辑:我创建了一个简单的 GitHub 示例来解释这个想法 https://github.com/jseminck/starter-kits/tree/master/struts2.spring

在我的 pom.xml 中,我添加了 Struts-Spring-Plugin:

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-spring-plugin</artifactId>
    <version>2.3.4.1</version>
</dependency>

我添加了 applicationContext.xml 并从我的 web.xml 中引用了它

Web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

applicationContext.xml

<context:component-scan base-package="com.jseminck.hello.world" />

<!-- Register Mongo Instance -->
<mongo:mongo id="mongo" host="localhost" port="27017" />
<!--  for defining mongo template -->

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg ref="mongo" />
    <constructor-arg name="databaseName" value="nortal" />
</bean>

<!-- For defining mongo repository -->
<mongo:repositories base-package="com.jseminck.hello.world.repository" />

HelloWorldRepository

@Repository
public interface HelloWorldRepository extends MongoRepository<HelloWorld, String> {

}

我是否缺少任何东西来使它正常工作?在调用应该实例化的 Bean 上的方法时,我得到 NullPointerException。

java.lang.NullPointerException
    com.jseminck.struts2.HelloAction.execute(HelloAction.java:20)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:453)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:292)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:255)
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:236)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:236)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:90)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:192)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:511)
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)

谢谢, 约阿希姆

【问题讨论】:

  • 您是在尝试自动装配动作还是其他 bean?
  • 自动装配其他一些 bean(在这种情况下:MongoRepository - 但我无法让我的 applicationContext 中定义的任何 bean 工作)。
  • 工作是什么意思?
  • 当我在具有 @Autowire 注释的 bean 上调用方法时,我不断收到 nullpointerexception。所以它没有被实例化。/注入。
  • 你能发布一个堆栈跟踪吗?

标签: java xml spring mongodb struts2


【解决方案1】:

你忘了告诉 Struts2 关于使用 Spring 作为 ObjectFactory

将以下常量放入您的 struts.xml 配置中:

<constant name="struts.objectFactory" value="spring" />

<package ...>

有关this answer 的更多信息,尽管我猜你已经知道它们,因为你的所有其余配置似乎都很好。

【讨论】:

  • 是的,我已经有了这个选项(但我的价值是 org.apache.struts2.spring.StrutsSpringObjectFactory)。我确定我的 applicationContext 中的 bean 被识别(当我给出错误的包/类名时,我得到一个 ClassNotFoundError)。我只是无法在我的应用程序中 @Autowire 他们。
  • 你不知道你正在回答。顺便说一句,他不是在尝试将 applicationContext 中定义的 bean 自动装配到 Action(或 Interceptor)中吗?
  • 智能猜测,如 jQuery。
  • 是的。我正在尝试将 HelloWorldRepository 自动装配到我的 HelloAction 中。
  • 请发布您的完整 applicationContext.xml 和完整的 web.xml
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 2018-05-08
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多