Как я могу ввести локальные переменные статического метода внутри абстрактного класса, используя 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 не позволяет вам вводить зависимости в статические поля. Есть некоторые обходные пути, такие как инъекция в статическом поле и внутри сеттерного набора, но они злые и могут испортить ваш код. Так что просто сделайте этот метод не статичным. И извините за статическое ключевое слово в моих примерах, оно было скопировано и вставлено, и, конечно, оно не будет работать со статическим методом.

Другие вопросы по тегам