Spring : 요청 범위 빈에 HttpServletRequest를 어떻게 주입합니까?


96

Spring에서 요청 범위 빈 을 설정하려고합니다 .

요청 당 한 번 빈이 생성되도록 성공적으로 설정했습니다. 이제 HttpServletRequest 객체에 액세스해야합니다.

빈은 요청 당 한 번 생성되기 때문에 컨테이너가 내 빈에 요청 객체를 쉽게 주입 할 수 있다고 생각합니다. 어떻게 할 수 있습니까?

답변:


115

요청 범위 빈은 요청 객체와 자동 연결될 수 있습니다.

private @Autowired HttpServletRequest request;

2
이에 대한 구식 XML 방식이 있습니까?
cherouvim

2
나를 위해 작동하지 않습니다 (봄 mvc 3.1)-수행해야 할 더 많은 것이 있습니까? Samit의 솔루션으로 이동합니다.
kldavis4 2012

2
문제는 MockMvc와 이런 종류의 주입을 사용하여 유효성 검사기를 테스트 할 때 문제가 있다는 것입니다. 이 경우 다른 솔루션이 선호 될 수 있습니다
Neyko 2013

21
HttpServletRequest의 경우 Spring은 요청의 실제 인스턴스를 얻는 방법을 알고있는 프록시 HttpServletRequest를 생성하기 때문에 HttpServletRequest를 요청 범위가 아닌 빈에도 자동 연결하는 것이 가능합니다. 따라서 컨트롤러가 싱글 톤 범위 인 경우에도 요청을 자동 연결하는 것이 안전합니다.
vtor

3
Spring <= 3.1 사용자에 대한 경고는 자동 연결이 테스트 실행에서 작동하지 않습니다.
Rubens Mariuzzo

138

Spring 은 유형 의 래퍼 객체를 통해 현재 HttpServletRequest객체 ( 현재 객체뿐만 아니라)를 노출합니다 . 이 래퍼 객체는 ThreadLocal에 바인딩되며 메서드 를 호출하여 얻습니다 .HttpSessionServletRequestAttributesstaticRequestContextHolder.currentRequestAttributes()

ServletRequestAttributes방법을 제공하고 getRequest(), 현재 요청을 얻기 위해 getSession()모두 범위에 저장된 속성을 얻을 수있는 현재 세션과 다른 방법을 얻을 수 있습니다. 다음 코드는 약간 못 생겼지 만 응용 프로그램의 모든 위치에서 현재 요청 객체를 가져옵니다.

HttpServletRequest curRequest = 
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();

있습니다 RequestContextHolder.currentRequestAttributes()방법은 인터페이스 및 요구 사항을 반환에 typecasted 할 ServletRequestAttributes것을 구현 인터페이스를.


Spring Javadoc : RequestContextHolder | ServletRequestAttributes


8
주입은 좋은 해결책이지만 HttpServletRequest를 주입하는 Spring 유효성 검사기를 테스트하는 MockMvc에서 문제를 발견했습니다. 따라서 모의 테스트와 프로덕션 코드를 모두 올바르게 실행하려면 이것이 선택되어야합니다.
Neyko 2013

@Neyko 왜입니까? 모의 테스트 (단위 테스트?)의 경우 모의 HttpServletRequest 또는 원하는 것을 주입 할 수 있습니다. 그렇지 않습니까? 아니면 MockHttpServletRequest를 사용할 수 있습니까?
wonhee

싱글 톤 범위 서비스 인스턴스에서 사용하는 것이 안전합니까?
진 권

2

여기에서 제안한 HttpServletRequest대로 as a method param을 삽입 할 수도 있습니다 . 예 :

public MyResponseObject myApiMethod(HttpServletRequest request, ...) {
    ...
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.