Spring MVC Бины интеграции RestEasy не внедряются в классы контроллера - PullRequest
0 голосов
/ 19 апреля 2020

Я работаю над проектом, у которого есть весна mvc 2.5. *. Я интегрировал RESTeasy для создания конечных точек отдыха. Я определил класс контроллера с помощью @Controler. У меня есть bean-компонент, который должен быть введен в этот контроллер, но кажется, что он не внедряется, поэтому он генерирует исключение нулевого указателя, когда переменная bean-компонента используется в методах отдыха контроллера.

Я добавил их в Интернет. 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>

Пользовательский класс I расширен от класса resteasy для определения пути приложения:

@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;
    }
}

У меня есть сервлет. xml, который определил mvc Контроллер EJB работает нормально: например:

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

Мой класс Controller выглядит следующим образом:

@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 ;
}

}

Здесь я добавил еще один компонент в сервлет. xml as,

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

В отдельном компоненте xml employeeService определен. Просто это не отразится на компоненте employeeController. Я не уверен, создан ли даже компонент employeeController или нет. Но я могу успешно позвонить на конечную точку. инициализация компонента работает нормально, если поместить компонент employeeService в контроллер MVC. Например:

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

Но не в RestController. Любая идея об этом поведении. Я скучаю по любой конфигурации здесь.

1 Ответ

0 голосов
/ 19 апреля 2020

во-первых, вы должны определить бин employeeService следующим образом:

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

загрузить указанный выше файл конфигурации xml в сеть. xml,

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

затем , вы можете использовать employeeService bean

использовать аннотацию @PostConstruct для вызова этим методом после инициализации employeeService bean

@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;
}
...