在春季启动中创建动态服务

时间:2020-04-18 05:56:48

标签: java spring spring-boot

我需要一种创建动态/通用休息客户端的方法。我的spring boot应用程序需要连接到许多第三方客户端,所有这些客户端都有不同的请求正文,响应正文,有些需要特殊的标头,而有些则需要特殊的授权/身份验证(例如,基本身份验证,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 个答案:

答案 0 :(得分: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();
    }
}

就是这样。希望我能很好地满足您的需求。让我知道是否有不清楚的地方,我们会解决的:)