【问题标题】:SpringMVC RestEasy Integration Beans aren't injected to Controller classesSpringMVC RestEasy 集成 Bean 未注入控制器类
【发布时间】:2020-04-19 10:46:24
【问题描述】:

我正在开发一个包含 spring mvc 2.5.* 的项目。我已经集成了 RESTeasy 来创建 restful 端点。我用@Controler 定义了一个控制器类。我有一个 bean 应该被注入到这个控制器,但它似乎没有被注入,因此当 bean 变量用于控制器休息方法时它会抛出一个空指针异常。

我已将这些添加到 web.xml

<context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/rest</param-value>
</context-param>

<servlet>
    <servlet-name>resteasy-servlet</servlet-name>
    <servlet-class>
        org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
    </servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.test.package.controller.MyApplication</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>resteasy-servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

自定义类我从resteasyApplication类扩展来定义应用路径:

@ApplicationPath("/rest")
public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        final Set<Class<?>> classes = new HashSet<>();
        // register root resource
        classes.add(EmployeeController.class);
        return classes;
    }
}

我有一个 servlet.xml,它定义了工作正常的 mvc 控制器 bean: 例如:

  <bean name="/testDetail.html" class="com.test.package.controller.TestDetailController" parent="baseController">
    <property name="testService" ref="testService"/>
  </bean>

我的控制器类如下所示:

@Controller
@Path("/employee")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class EmployeeController {

private static final Log LOG = LogFactory.getLog(EmployeeController.class);

private EmployeeService employeeService; // This doesn't get initiated.

@PUT
@Path("/update/{empId}")
public Response updateEmp(@PathParam("empId") Long empId, EmpRequest request) {

    Response response = null;
    employeeService.update(request); // NULL POINTER THROWN HERE, employeeService is null

    return response;
}
public EmployeeService getEmployeeService () {
    return employeeService ;
}

public void serEmployeeService (EmployeeService employeeService ) {
    this.employeeService = employeeService ;
}

}

这里我在 servlet.xml 中添加了另一个 bean,

  <bean id="employeeController " class="com.test.package.controller.EmployeeController">
    <property name="employeeService " ref="employeeService "/>
  </bean>

在一个单独的xml 中定义了employeeService bean。只是它不会反映在employeeController bean 中。我不确定是否甚至创建了employeeController bean。但我能够成功调用端点。如果将employeeService bean 放在MVC 控制器中,bean 启动工作正常。例如:

  <bean name="/testDetail.html" class="com.test.package.controller.TestDetailController" parent="baseController">
    <property name="employeeService " ref="employeeService "/>
  </bean>

但不在 RestController 中。关于这种行为的任何想法。我在这里缺少任何配置吗?

【问题讨论】:

    标签: java spring spring-mvc resteasy


    【解决方案1】:

    首先,您应该如下定义employeeService bean,

    <bean id="employeeService" class="com.test.package.service.EmployeeService">
        --------
    </bean>
    

    在 web.xml 中加载上述配置 xml 文件,

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/XML_FILE_PATH/XML_FILE_NAME.xml</param-value>
    </context-param>
    

    那么,你可以使用employeeService bean

    employeeService bean 初始化后,使用@PostConstruct 注解调用此方法

    @PUT
    @PostConstruct
    @Path("/update/{empId}")
    public Response updateEmp(@PathParam("empId") Long empId, EmpRequest request) {
    
        Response response = null;
        employeeService.update(request); // NULL POINTER THROWN HERE, employeeService is null
    
        return response;
    }
    

    【讨论】:

    • 就像我说的,它已经在一个单独的 xml 中定义了。那个xml也被导入了。就像我说它在 MVC 控制器 bean
    • 抱歉出错,将此配置xml文件添加到web.xml中
    • 很抱歉给您带来不便,我认为建议的两个步骤已在您的项目中完成
    • 请参考,以上修改答案
    • 已经加载到 web.xml contextConfigLocation/WEB-INF/emp-spring.xml-value> 在emp-spring.xml里面,被导入。 spring-service.xm 有 --------
    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 2013-01-25
    • 2017-07-26
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    相关资源
    最近更新 更多