在 Spring Boot 中创建动态服务
Posted
技术标签:
【中文标题】在 Spring Boot 中创建动态服务【英文标题】:Creation of a dynamic service in spring boot 【发布时间】:2020-04-18 05:56:48 【问题描述】:我需要一种创建动态/通用休息客户端的方法。我的 Spring Boot 应用程序需要连接到许多第三方客户端,它们都有不同的请求正文、响应正文,有些需要特殊的标头,而有些需要特殊的授权/身份验证(例如 Basic Auth、JWT、HMAC 等)。
到目前为止,我已经设法提出了以下客户端
public class GenericRestClient<T, V>
private RestTemplate restTemplate = new RestTemplate();
public V execute(RequestDetails requestDetails, T data, ResponseErrorHandler errorHandler,
Class<V> genericClass) throws ResourceAccessException, Exception
restTemplate.setErrorHandler(errorHandler);
HttpHeaders headers = new HttpHeaders();
HttpEntity<T> entity = new HttpEntity<T>(data, headers);
ResponseEntity<V> response = restTemplate.exchange(requestDetails.getUrl(), requestDetails.getRequestType(),
entity, genericClass);
return response.getBody();
但我的问题是。当它们都有不同的要求时,现在有没有办法生成所有必要的标头、身份验证和授权?我该怎么做?
有没有办法将 java 代码像脚本(例如 JTX)一样存储在数据库中并使用它们,或者有没有更好的方法来满足我的需求?
我希望即使有新客户来,也不需要进行进一步的编码。
【问题讨论】:
【参考方案1】:您可以将每个客户端的配置存储在数据库中。如果你使用 JPA,你最终会得到这样的类:
@Entity
class RestClientConfiguration
private String url;
private Map<String,String> headers;
//whatever data you need
那么你只需要将RestClientConfiguration
传递给你的GenericRestClient
类。
public class GenericRestClient<T, V>
public V execute(RequestDetails requestDetails, T data, ResponseErrorHandler errorHandler,
Class<V> genericClass, RestClientConfiguration clientConfiguration) throws ResourceAccessException, Exception
String url = clientConfiguration.getUrl();
Map<String, String> headerMap = clientConfiguration.getHeaders();
//here add code which map headerMap which is a Map to HttpHeaders object
RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(errorHandler);
HttpHeaders headers = new HttpHeaders();
HttpEntity<T> entity = new HttpEntity<T>(data, headers);
ResponseEntity<V> response = restTemplate.exchange(requestDetails.getUrl(), requestDetails.getRequestType(),
entity, genericClass);
return response.getBody();
就是这样。希望我能很好地满足您的需求。如果有什么不清楚的地方请告诉我,我们会解决的:)
【讨论】:
有没有办法做到这一点,即使新客户来了,也不需要编写任何代码。如果可以从数据库或脚本中获取配置?我希望它非常动态和通用。 我相信是的。您可以在任何地方保留配置,只需设置RestTemplate
查看该教程:baeldung.com/spring-rest-template-builder
但是如果出现客户端的新配置,我必须创建一个新的休息模板。
完全正确,您对此有意见吗?
嗯,我的团队负责人希望这样,当新客户出现时,只能在数据库中进行更改,而不是在代码本身中进行。以上是关于在 Spring Boot 中创建动态服务的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 中创建一个调用包含构造函数注入的服务的测试?
我想在 Spring Boot 集成测试中创建 bean 之前模拟服务器
在 Spring Boot 中创建 PROXY 服务,监听多个端口,并将 GET 请求重定向到新 URL