Как мне конструктор-автопроводить HttpServletResponse в Spring 3.1?

У меня есть bean-компонент с областью запроса, и мне нужен доступ к объектам HttpServletResponse и HttpServletRequest.

Мне нужен доступ к этим объектам в конструкторе, поэтому автосвязывание свойств не вариант.

Я сделал следующее:

@Component
@Scope("request")
public class MyClass{

    @Autowired(required=true)
    public MyClass(HttpServletRequest request, HttpServletResponse response) {

        // do stuff I need to do in the constructor

    }
}

Это дает мне следующую ошибку:

Конструктор по умолчанию не найден; вложенным исключением является java.lang.NoSuchMethodException: com.foo.bar.MyClass.()

Согласно этому сообщению об ошибке, он ищет несуществующий конструктор по умолчанию без параметров. Я автоматически подключил конструктор и специально установил для «требуемого» значение true, поэтому инжектор должен выбрать этот конструктор. Поскольку bean-компонент является областью запроса, это должно работать, но это не так.

Любые идеи?


person GeorgeStone    schedule 16.01.2012    source источник


Ответы (2)


Насколько я понимаю, вы не сможете автоматически подключить объект HttpServletResponse, используя стандартный подход. Проверьте метод registerWebApplicationScopes класса WebApplicationContextUtils. Разрешимыми зависимостями являются только HttpSession.class и HttpSession.class .

Найдите специальное решение здесь .

person Aravind A    schedule 17.01.2012
comment
Спасибо. Пользовательское решение кажется немного хакерским, поэтому я переписал свою логику, чтобы поместить функцию bean-компонента в HandlerInterceptor, где эти 2 объекта доступны по умолчанию. - person GeorgeStone; 18.01.2012
comment
И если я делаю портлет, доступен ли PortletRequest для автоматического связывания? - person rascio; 31.01.2012

Как упомянул @Aravind, HttpServletResponse недоступен в качестве кандидата на автопроводку. Однако вы можете получить доступ к ответу, используя ServletWebRequest.getResponse() и ServletWebRequest (специальный класс Spring) доступен в качестве кандидата на автоподключение.

Сказав это, это может не работать в конструкторе, но все равно попробуйте :)

person skaffman    schedule 17.01.2012
comment
Только что попробовал это. Когда вы автоматически связываете ServletWebRequest, WebApplicationContextUtils.WebRequestObjectFactory.getObject() создает его и, к сожалению, не устанавливает объект ответа. - person yclian; 10.03.2012