Можно ли удаленно выставить бин при весенней загрузке, используя REST и httpInvoker
Мне нужно предоставить какой-то сервис для удаленного использования клиентами Java (они должны использовать httpinvoker) и другими языками (они должны использовать REST).
Могу ли я настроить весеннюю загрузку, чтобы выставить оба? (Я не против, если будут использоваться два отдельных экземпляра с разными портами, как в этом посте).
Я отказался от идеи предоставления API для клиентов Java, которые внутренне используют REST, потому что довольно утомительно связывать все конечные точки REST в код вручную, используя RestTemplate.
Мне нравится концепция HttpInvoker, потому что ProxyFactoryBean
привыкает автоматически. Если Spring Remoting сможет сделать это так, как это может быть сделано для JMS, AMQP и других, я бы возглавил этот путь.
6 ответов
Вы можете использовать что-то вроде этого. Выставьте свои услуги как отдых. Затем заставьте своих клиентов Java использовать эти сервисы, используя http или другую библиотеку. Если любая другая сторона также заинтересована, они могут потреблять ее по-своему.
В противном случае вы можете создать свой собственный jar-файл, использующий ваши службы отдыха, и позволить своим клиентам java использовать его, не зная об услуге отдыха.
Выставление конечных точек HTTP invoker в Spring Boot на самом деле настолько просто, что кажется, что чего-то не хватает. В @SpringBootApplication
который имеет spring-webmvc
на своем пути (например, используя spring-boot-starter-web
POM), добавьте следующее определение компонента:
@Bean(name = "/my.service")
public HttpInvokerServiceExporter myHttpInvokerServiceExporter(MyService myServiceImpl) {
HttpInvokerServiceExporter exporter = new HttpInvokerServiceExporter();
exporter.setServiceInterface(MyService.class);
exporter.setService(myServiceImpl);
return exporter;
}
Конечная точка HTTP invoker теперь доступна по адресу /my.service
и не повлияет на другие сопоставления. Вы можете добавить столько конечных точек, сколько захотите; а затем некоторые @RequestMapping
S для отдыха на вершине.
Spring HTTP Invoker опасно использовать в случае, если доверие вызывающего объекта не может быть проверено. Он устарел довольно давно, и его поддержка будет удалена в Spring 6, поэтому не используйте его.
Лучше всего реализовать связь как вызов REST и обернуть его простым в использовании методом, как предполагают некоторые другие ответы, например, ответ Малина Абеварданы - /questions/23237894/mozhno-li-udalenno-vyistavit-bin-pri-vesennej-zagruzke-ispolzuya-rest-i-httpinvoker/23237908#23237908.
Использованная литература:
- https://github.com/spring-projects/spring-framework/issues/27422 — Удаление удаленного взаимодействия в стиле RPC: Hessian, HTTP Invoker, JMS Invoker, JAX-WS
- https://nvd.nist.gov/vuln/detail/CVE-2016-1000027 — CVE-2016-1000027 Сведения
- https://github.com/spring-projects/spring-framework/issues/24434#issuecomment-579669626 — «Сериализация Java небезопасна, и все, что мы можем сделать, это посоветовать не раскрывать конечные точки HTTP Invoker ненадежным клиентам»
PS Да, я знаю, что этот вопрос очень старый, и я уверен, что OP больше не нуждается в ответе, но я пишу его с учетом всех других будущих читателей, чтобы они не использовали Spring HTTP Invoker или любой другой Возможности Spring, подобные RPC/RMI.
Взгляните на весенний отдыхающий. Он связывает интерфейсы Java с сервисами REST. Это не решает проблему "разоблачения" службы, но значительно упрощает ее использование.
Мы используем обе техники здесь. HttpInvoker для вызовов Java-Java. Обычный JSON поверх HTTP для других клиентов (аналогично REST, но не истинному REST). Я думаю, что проект jsonrpc4j предоставляет хороший способ реализовать HTTP-материал.
HttpInvoker был удален после весенней интеграции 2.x: http://docs.spring.io/spring-integration/docs/2.0.x/reference/html/httpinvoker.html (! Важный заголовок содержит подробности). Существует ссылка на поддержку HTTP в версиях 3.x и 4.x: http://docs.spring.io/spring-integration/docs/latest-ga/reference/html/http.html
Есть также еще один пост SO, в котором кто-то спрашивает о поддержке HTTP и весенней загрузке с некоторой соответствующей информацией: Spring Integration Http с Spring Boot и @RequestMapping
Надеюсь, это поможет вам выйти из кроличьей норы.