J'essaie actuellement d'incorporer un HandlerInterceptorAdapter
mais que cela ne se regrette pas et la comparant à d'autres réponses est difficile, car tout le monde utilise quelque chose de différent. Et je suis au courant, webmvcconfigureadapter est obsolète, certains versions sont au-delà de mon contrôle pour la portée du projet, voir les spécifications d'utilisation ci-dessous.
Quelqu'un peut-il vous fournir des conseils sur l'incorporation des intercepteurs avec un plaque de repos (ce qui n'est pas clientPRequestterceptor).
Principale:
@SpringBootApplication
@EnableRetry
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder applicationBuilder) {
return applicationBuilder.sources(Application.class);
}
@Bean
private RestTemplate restTemplate(){
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("redacted", 8080));
SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
simpleClientHttpRequestFactory.setProxy(proxy);
simpleClientHttpRequestFactory.setOutputStreaming(false);
RestTemplate template = new RestTemplate();
template.setErrorHandler(new MyResponseErrorHandler());
return template;
}
}
Intercepteur: com.example.foo.config.request.interceptor
@Component
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("INTERCEPTED");
return super.preHandle(request, response, handler);
}
}
Interceptorconfig: com.example.foo.config.request.interceptor
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
@Bean
MyInterceptor myInterceptor() {
return new MyInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
System.out.println("Adding interceptor");
registry.addInterceptor(myInterceptor());
}
}
"Ajouter un intercepteur" est connecté, donc je sais que les configures sont en cours de numérisation. Je ne peux tout simplement pas obtenir de logique intercepteur pour vous connecter.
En utilisant:
HandlerInterceptorAdapter
est une implémentation qui s'applique à @Controller
ou alors @RestController
. Pas une implémentation pour RestTemplete
.
Pour l'appliquer à RestTemplete
, vous devez utiliser ClientHttpRequestInterceptor
.
ex.
@Component
public class CustomInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
// ...
}
}
@Configuation
public class RestTempleteConfig {
// ...
@Autowired
private CustomInterceptor customInterceptor;
@Bean
public RestTemplate restTemplate(){
RestTemplate template = new RestTemplate();
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
template.add(customInterceptor);
return template;
}
}
Le HandlerInterceptorAdapter
est pour le serveur (I.e. RestController) pour intercepter certains événements importants lorsque Server traite une demande HTTP, ce n'est rien à voir avec quel client HTTP (E.G RestTemplate
) est utilisé.
Si vous souhaitez utiliser RestTemplate
comme client HTTP et souhaitez intercepter la demande juste avant son envoi et la réponse juste après sa réception, vous devez utiliser ClientHttpRequestInterceptor
.
J'essaie d'intercepter des demandes et des réponses de manière plus flexible que celle de CompteHtPeQuestInterceptor.
Depuis votre commentaire ci-dessus, quels sont vos cas d'usage réels qu'il ne peut pas gérer? Je pense que ClientHttpRequestInterceptor
est déjà assez flexible pour mettre en œuvre une logique complexe pour intercepter la demande et la réponse. Comme votre question ne fournit aucune information sur la manière dont vous devez intercepter, je ne peux que donner un exemple général pour montrer ce que le ClientHttpRequestInterceptor
peut offrir.
Pour configurer la plaque de repos pour utiliser un intercepteur:
RestTemplate rt = new RestTemplate();
List<ClientHttpRequestInterceptor> interceptors= new ArrayList<ClientHttpRequestInterceptor>();
inteceptors.add(new MyClientHttpRequestInterceptor());
Et le clientprasseterceptor ressemble à:
public class MyClientHttpRequestInterceptor implements ClientHttpRequestInterceptor{
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
//The HTTP request and its body are intercepted here which you can log them or modify them. e.g.
System.out.println("Log the HTTP request header: " + request.getHeaders());
//Modify the HTTP request header....
request.getHeaders().add("foo", "fooValue");
//Throw exception if you do not want to send the HTTP request
//If it is at the end of the interceptor chain , call execution.execute() to confirm sending the HTTP request will return the response in ClientHttpResponse
//Otherwise, it will pass the request to the next interceptor in the chain to process
ClientHttpResponse response= execution.execute(request, body);
//The HTTP response is intercepted here which you can log them or modify them.e.g.
System.out.println("Log the HTTP response header: " + response.getHeaders());
//Modify the HTTP response header
response.getHeaders().add("bar", "barValue");
return response;
}
}
Veuillez noter que vous pouvez également configurer une chaîne de ClientHttpRequestInterceptor
qui permet de scinder une demande complexe et une réponse intercepte la logique dans de nombreux petits et réutilisables ClientHttpRequestInterceptor
. Il est conçu avec le chaîne de responsabilité modèle de conception que son expérience d'API est très similaire à ce que Filter#doFilter()
dans Servlet
.