web-dev-qa-db-fra.com

Intercepteur de la plaque de repos

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:

  • Botte de printemps V1.5.15
  • Version printanière: 4.3.18.Release
5
soulshined

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;
    }
}
1
WonChul Heo

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.

0
Ken Chan