Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

Spring: внедрить объект возвращаемый классом

10.12.2014, 13:25. Показов 1292. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу в своём REST клиенте внедрить результат что возвращает ws.rs.client, но не знаю как это сделать.
Пример как это используется без DI:
Java
1
2
3
4
        WebTarget target = client.target("http://myURL/api/employee/1");
        EmployeeService service = new EmployeeService();
        service.setClient(client);
        service.setTarget(target);
Теперь же я хочу чтобы было примерно так:
Java
1
2
3
4
5
6
7
8
9
import javax.ws.rs.client.Client;
import javax.ws.rs.client.WebTarget;
 
@Service
public class EmployeeService {
    @Inject Client client;
    @Inject WebTarget target;
...
}
С внедрением Client проблем нет, я просто добавил в config:
XML
1
2
3
4
       <bean id="WSRSClient"
             class="javax.ws.rs.client.ClientBuilder"
             factory-method="newClient"
             scope="singleton"/>
А вот как теперь создать бин, который является результатом вызова WSRSClient.getClient("myURL/...") ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.12.2014, 13:25
Ответы с готовыми решениями:

FormData в объект DTO Spring mvc
Есть такое DTO: public class OwnerProfileUpdateDTO { private String firstName; private String lastName; ...

[Spring Core] Почему не можем сделать autowire в созданный через new объект?
Объясните, почему autowiring требует наличия в контексте бина, в который происходит внедрение зависимости? @Component public class...

Constexpr array возвращаемый классом-потомком
Здравствуйте, хотелось бы реализовать следующую иерархию классов. Есть базовый класс с чисто виртуальной функцией, возвращающей ссылку на...

3
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
10.12.2014, 16:47
неочень понятна логика. Внедрение объектов хранящих состояние это плохая практика.
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
10.12.2014, 22:52  [ТС]
Какое состояние?
Target не перенацеливается же что соответствует логике так как адрес сервиса не меняется, если начать цеплять к target'у параметры, или добавлять адрес то он вернёт новый объект Target, или я где-то неправ?
Сама цель такова: мой сервис (кстати точно ли название сервис хорошо отражает смысл? Под сервисом клиента я имею в виду класс, который в курсе где на сервере что хранится и как надо передать параметры чтобы получить объекты) получает jax.rs.target и jax.rs.client'а чтобы делать свои запросы и таким образом чтобы не был захардкожен адрес сервиса. Так как адрес сервиса не меняется то и целиться я в него собрался один раз.

В принципе я этого добился несколько иным путём:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class EmployeeService {
    Client client;
    WebTarget target;
 
    public EmployeeService(Client client, String targetAddress) {
        this.client = client;
        this.target = client.target(targetAddress);
    }
 
    public Employee getEmployee(long id){
        Response response = target.path("/" + id).request().get();
        return response.readEntity(Employee.class);
    }
 
    public Collection getEmployees(){
        Response response = target.path("/all").request().get();
        return Arrays.asList(response.readEntity(Employee[].class));
    }
}
XML
1
2
3
4
5
6
7
8
9
       <bean id="WSRSClient"
             class="javax.ws.rs.client.ClientBuilder"
             factory-method="newClient"
             scope="singleton"/>
 
        <bean id="EmployeeService" class="com.dw.client.service.EmployeeService" scope="singleton">
            <constructor-arg name="client" ref="WSRSClient"/>
            <constructor-arg name="targetAddress" value="http://localhost:8080/EmployeeServer1/api/employee/"/>
        </bean>
Критикуйте если это плохой подход, я сколько не гуглил так и не нашёл же человеческого примера большого сервиса где есть необходимость в таком подходе, одни хелло ворлды раздающие один класс где и так захардкодить не долго ... кстати кто-то мне обещал пример и просил напомнить, так вот напоминаю
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
11.12.2014, 10:29
веб клиент это обычный объект, который не обязательно хранить в контексте спринга и инжектить в сервис. Если сервис пользуется удаленными сервисами для получения объекта, вполне нормально создать WebTarget прямо в методе, а значение url удаленного сервера взять из конфигурации.

Вот фрагмент кода из одного проекта который реализует подобное поведение. Методы некого сервиса.


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 protected <T> T callCatalogServiceGet(TypeReference<T> returnedClass, String methodName, String path, Map<String, Object> params) {
        T response = null;
        WebTarget resourceTarget = createWebTarget(methodName, path, params);
        try {
            response = resourceTarget.request().get(returnedClass);
        } catch (NotFoundException ex) {
            handleItemNotFoundException(path, ex);
        }
        return response;
    }
    
   protected WebTarget createWebTarget(String methodName, String path, Map<String, Object> params) {
        WebTarget target = restClient.target(remoteServerUrl); //remote server url obtained from properties file
        String fullPath = methodName;
        if(path != null) {
            fullPath += path;
        }
        WebTarget resourceTarget = target.path(fullPath);
        if (params != null) {
            for (Map.Entry<String, Object> param : params.entrySet()) {
                resourceTarget = resourceTarget.queryParam(param.getKey(), param.getValue());
            }
        }
        return resourceTarget;
    }
Использование в методе интерфейса

Java
1
2
3
4
5
6
7
8
    @Override
    public Product getProduct(Long id, CountryCode countryCode, CurrencyCode currencyCode, Long partnerId) {
        Map<String, Object> params = new HashMap<>();
        params.put("countryCode", countryCode);
        params.put("currencyCode", currencyCode);
                params.put("currencyCode", partnerId);
        return callCatalogServiceGet(new TypeReference<Product>() {}, PRODUCT_METHOD_NAME, PATH_DELIMITER + id, params);
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.12.2014, 10:29
Помогаю со студенческими работами здесь

Возвращаемый объект разрушается
Написал класс &quot;безопасный массив&quot; и написал метод: const classname&amp; add(int, double) const {classname tmp(*this) *Пропустим return tmp;}...

Ссылка на объект, возвращаемый функцией
Безопасно ли подобное? typedef std::vector&lt; string &gt; vec; vec someFoo(); vec someBoo() { // что-то делаем vec &amp; x =...

Возвращаемый объект пропадает при выходе из функции
Коллеги, ситуация такая: Есть документ -&gt; В документе поле -&gt; В поле массив: путь к БД и UNID. Есть кнопка, которая открывает данный...

Нужно внедрить в 1С объект участка бухгалтерского учета «Инвентаризация» в типовую конфигурацию 1С:Предприятие
Нужно в 1С создать на пример вкладку: Инвентаризация по складам или по компьютерной технике.???

Как проверить является ли объект базовым классом или наследником
struct Base { int i = -1; }; struct Derived : Base { double d = 0.1; };


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru