Как я могу ввести локальные переменные статического метода внутри абстрактного класса, используя Spring?
Я новичок в Spring и столкнулся с этой проблемой. Я попытался использовать @Autowired в методе, но он не работал, в переменных я получаю сообщение об ошибке "Аннотация @Autowired запрещена для этого местоположения" из затмения. У меня есть необходимые бобы, созданные в XML.
Ниже приведен код, этот метод находится внутри абстрактного класса.
private static HttpResponse rawExecuteReqeust(HttpUriRequest request) throws ClientProtocolException, IOException {
HttpClient client = new DefaultHttpClient();
ProxyInterface proxyI; // needs to be Injected
User user; // needs to be Injected
System.out.println("About to execute " + request.getMethod() + " request on "
+ request.getURI());
if (proxyI.getProxyHost() != null && proxyI.getProxyPort() != 0) {
if (user.getProxyUser() != null && user.getProxyPassword() != null) {
((AbstractHttpClient) client).getCredentialsProvider().setCredentials(
new AuthScope(proxyI.getProxyHost(), proxyI.getProxyPort()),
new UsernamePasswordCredentials(user.getProxyUser(), user.getProxyPassword()));
}
HttpHost proxy = new HttpHost(proxyI.getProxyHost(), proxyI.getProxyPort(), "http");
client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
}
HttpResponse response = client.execute(request);
return response;
}
(ps я новичок в stackOverflow и надеюсь, что я правильно отформатировал вопрос:))
2 ответа
Если это возможно для вас повернуть user
а также proxyI
в статические свойства вы можете внедрить их, используя MethodInvokingFactoryBean. Вам нужно будет предоставить метод статического установщика. Чтобы дать вам представление о конфигурации:
<bean name="staticHubInitializer" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="staticMethod" value="your.AbstractUtilClass.setStaticDependencies"/>
<property name="arguments">
<list>
<ref bean="user"/>
<ref bean="proxyI"/>
</list>
</property>
</bean>
Из документации @Autowired
Помечает конструктор, поле, метод сеттера или метод конфигурации как автоматически подключаемые средствами Spring для внедрения зависимостей.
Как видите, нет локальных переменных. Так что Eclipse прав. А в Java вы не можете аннотировать локальные переменные другими аннотациями. Это невозможно вообще.
Итак, у вас есть два варианта:
Сделайте полевого пользователя и введите его там.
public class Test {
@Autowired
private User user;
private HttpResponse rawExecuteReqeust(){
// do something with field user
}
}
Создайте своего рода UserService, который предоставит вам пользовательские объекты
public class Test {
@Autowired
private UserService userService;
private HttpResponse rawExecuteReqeust(){
User user = userService.getUser();
// do something with local variable user
}
}
Все это очень хорошо освещено в документации Spring. После прочтения все будет гораздо понятнее для вас.
UPD: Оказалось, что с Java 8 вы можете иметь аннотации на ваши локальные переменные. Я не углублялся в это, но это не поможет, потому что Spring не использует этот тип цели и, скорее всего, эти аннотации не дают вам доступа к значению локальной переменной.
UPD2 Нет, Spring не позволяет вам вводить зависимости в статические поля. Есть некоторые обходные пути, такие как инъекция в статическом поле и внутри сеттерного набора, но они злые и могут испортить ваш код. Так что просто сделайте этот метод не статичным. И извините за статическое ключевое слово в моих примерах, оно было скопировано и вставлено, и, конечно, оно не будет работать со статическим методом.