【问题标题】:Creation of a dynamic service in spring boot在 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)一样存储在数据库中并使用它们,或者有没有更好的方法来满足我的需求?

我希望即使有新客户来,也不需要进行进一步的编码。

【问题讨论】:

    标签: java spring spring-boot


    【解决方案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
    • 但是如果出现客户端的新配置,我必须创建一个新的休息模板。
    • 完全正确,您对此有意见吗?
    • 嗯,我的团队负责人希望这样,当新客户出现时,只能在数据库中进行更改,而不是在代码本身中进行。
    猜你喜欢
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2022-11-19
    • 2015-03-17
    • 2021-06-09
    • 1970-01-01
    • 2019-12-16
    • 2019-11-22
    相关资源
    最近更新 更多