在 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

如何在 spring-boot 中的微服务中创建 Super/Base/Parent 类 - 在子类中扩展该类

在 Spring Boot 应用程序中动态创建模式

如何在 Spring Boot 中创建不同的 ThreadPoolTask​​Executor? [复制]