복붙노트

[SPRING] Spring @ Servlet에 게시 됨

SPRING

Spring @ Servlet에 게시 됨

Spring 프레임 워크 (2.5.4)를로드 시간 짜기와 함께 사용하고 있으며 @Configurable로 주석 된 서블릿에서 autowire 필드를 시도 할 때를 제외하고 모든 것이 모든 곳에서 잘 작동합니다 (비 스프링 엔티티에서는 스프링 빈에서). 좋은 NullPointerException을 ...

@Configurable(dependencyCheck=true)
public class CaptchaServlet extends HttpServlet{
    @Autowired
    private CaptchaServiceIface captchaService;

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    //    ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext());
    //    captchaService = (CaptchaServiceIface) ctx.getBean("captchaService");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Captcha c = captchaService.getCatpcha();
        req.getSession().setAttribute("captchaAnswer", c.getAnswer());
        resp.setContentType("image/png");
        ImageIO.write(c.getImage(), "png", resp.getOutputStream());
    }
}
<context:load-time-weaver/>
<context:spring-configured/>
<context:component-scan base-package="cz.flexibla2" />

내가 뭘 잘못하고 있는지에 대한 제안이 있습니까?

감사.

해결법

  1. ==============================

    1.https : // bugs.eclipse.org/bugs/show_bug.cgi?id=317874에서 메일 목록 토론 및 버그 보고서를 참조하십시오. 직관적으로 서블릿의 @Configurable 어노테이션은 를 사용할 때 인스턴스화 될 때 서블릿이 스프링으로 구성된다는 것을 스프링 프레임 워크에 알리는 데 충분해야한다는 데 동의합니다. 나는 spring-instrument * .jar 또는 spring-agent.jar 대신 -javaagent : /path/to/aspectjweaver.jar를 사용할 때 원하는 동작을 얻을 수 있음을 관찰했습니다. https : // jira.springframework.org/browse/SPR에서 Spring Jira로 문제를 제기하십시오. 문제는 서블릿 인스턴스가 아니라 클래스 자체가 Spring ContextLoaderListener가 호출되기 전에로드된다는 것입니다. 따라서 스프링 프레임 워크는 서블릿 클래스를 인스트루먼트 할 기회가 없습니다. 짐을 실은.

    https : // bugs.eclipse.org/bugs/show_bug.cgi?id=317874에서 메일 목록 토론 및 버그 보고서를 참조하십시오. 직관적으로 서블릿의 @Configurable 어노테이션은 를 사용할 때 인스턴스화 될 때 서블릿이 스프링으로 구성된다는 것을 스프링 프레임 워크에 알리는 데 충분해야한다는 데 동의합니다. 나는 spring-instrument * .jar 또는 spring-agent.jar 대신 -javaagent : /path/to/aspectjweaver.jar를 사용할 때 원하는 동작을 얻을 수 있음을 관찰했습니다. https : // jira.springframework.org/browse/SPR에서 Spring Jira로 문제를 제기하십시오. 문제는 서블릿 인스턴스가 아니라 클래스 자체가 Spring ContextLoaderListener가 호출되기 전에로드된다는 것입니다. 따라서 스프링 프레임 워크는 서블릿 클래스를 인스트루먼트 할 기회가 없습니다. 짐을 실은.

    로드 타임 위빙 (load-time-weaving)을위한 스프링 도구는 클래스 바이트 코드가로드되기 전에 클래스 바이트 코드를 변환 할 수 있다는 것을 기반으로합니다. 서블릿 컨테이너가 Spring에 의해 변환되기 전에 얻어지는 Class 객체의 인스턴스를 보유하고 있다면, 서블릿 컨테이너는 변형 된 클래스의 인스턴스를 생성 할 수 없으며 인스턴스 인스턴스를 생성 할 수도 없다 그 Class 오브젝트의 팩토리 메소드를 사용해 생성됩니다.

  2. ==============================

    2.이것은 서블릿이 Spring 컨텍스트가 초기화되기 전에 서블릿 컨테이너에 의해 인스턴스화되고 초기화되고,로드 타임 짜기를 처리하는 Spring 컨텍스트이기 때문에 가능성이 높습니다.

    이것은 서블릿이 Spring 컨텍스트가 초기화되기 전에 서블릿 컨테이너에 의해 인스턴스화되고 초기화되고,로드 타임 짜기를 처리하는 Spring 컨텍스트이기 때문에 가능성이 높습니다.

    당신의 물건이 서블릿 Spring 컨텍스트 내에서 또는 웹 애플리케이션 레벨에서 처리되고 있는가? 전자는 거의 확실하게 작동하지 않지만 (위에서 설명한 이유로) ContextLoaderListener를 사용하여 웹 응용 프로그램 수준의 구성이 작동 할 수 있습니다.

  3. from https://stackoverflow.com/questions/4184159/spring-autowired-in-servlet by cc-by-sa and MIT license