当前位置: 首页 > 知识库问答 >
问题:

通过获取已创建的RestTemboard来拦截RestTemboard

阎裕
2023-03-14

我有逻辑来拦截RestTemboard,我正在添加/注册该RestTemboard在配置文件中(SecurityConfiguration.java),但我想通过获取已注册的RestTemboard对象从另一个配置文件中添加该拦截器:

public class TranslogRestTemplateCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        boolean isRestTemplate = false;
        try {
            if (context.getBeanFactory() != null) {
                isRestTemplate = (context.getBeanFactory().getBean(RestTemplate.class) != null);
            }
        } catch (BeansException e) {
            return false;
        }
        return isRestTemplate;
    }
}

配置类:

@Configuration
public class RestTemplateConfig {

    private final MyInterceptor myInterceptor;

    @Value("${com.pqr.you.rest.enabled:true}")
    private boolean transEnabled;

    @Autowired
    public RestTemplateConfig(MyInterceptor myInterceptor) {
        this.myInterceptor = myInterceptor;
    }

    @Autowired
    private ApplicationContext appContext;

    // The logic added below is not working for me
    @Bean
    @Conditional(TranslogRestTemplateCondition.class)
    public RestTemplate addInterceptor(ApplicationContext appContext) {
        RestTemplate restTemplate = appContext.getBean(RestTemplate.class);
        if (transEnabled) {
            List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
            interceptors.add(myInterceptor);
            restTemplate.setInterceptors(interceptors);
        }
        return restTemplate;
    }
}

RestTemboard的实际逻辑,它将返回所需的拦截器和一些其他值(在返回此restTemboard时,我的拦截器也需要在此处添加,而不会覆盖现有值)或通过获取下面的restTempalte对象并将MyInterceptor添加到restTemboard。

@Configuration
public class SecurityConfiguration {

    @Bean
    public AbcInterceptor abcRequestInterceptor(XyzService xyzService) {
        return new AbcInterceptor("abc-app", null, xyzService);
    }

    // I dont want to create bean here 
    /*@Bean
    public MyInterceptor myInterceptor() {
        return new MyInterceptor();
    }*/ 

    @Bean
    public RestTemplate restTemplate(AbcRequestInterceptor abcRequestInterceptor) {
        RestTemplate restTemplate = new RestTemplate();
        List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
        interceptors.add(abcRequestInterceptor);
        //interceptors.add(myInterceptor); // I dont want to add this interceptor here
        restTemplate.setInterceptors(interceptors);
        return restTemplate;
    }
}

共有1个答案

连厉刚
2023-03-14

我认为在这种情况下您需要的是一个BeanPostProcess,而不是条件类。如果bean存在,它将允许您修改它。您可以像下面这样创建一个,而不是RestTemplateConfiguration类和条件

@Configuration
public class RestTemplatePostProcessor implements BeanPostProcessor {

    @Value("${com.pqr.you.rest.enabled:true}")
    private boolean transEnabled;

    @Bean
    MyInterceptor myInterceptor() {
        return new MyInterceptor();
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        if (bean instanceof RestTemplate) { // or you can check by beanName if you like
            final RestTemplate restTemplate = (RestTemplate) bean;

            if (transEnabled) {
                List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
                interceptors.add(myInterceptor());
                restTemplate.setInterceptors(interceptors);
            }
            return restTemplate;
        }
        return bean;
    }
}

请注意,在您的代码中,您正在尝试创建另一个RestTemboard实例(名为“addInterceptor”),这似乎是不需要的。

 类似资料:
  • 我试图在javascript中为fetch创建一个拦截器(更具体地说是React)。它应该从每次调用的fetch中获取结果,如果是401错误,它应该向另一个路由发起新的fetch调用,以获取cookie(刷新令牌)。然后,应该再次尝试原始的fetch调用(因为现在用户已经登录)。 我已经成功地触发了新的fetch调用,并为每个调用发回了cookie,但我遇到了以下两个问题: 我似乎在使用async

  • 我想为我的Android手机写一个软件,拦截来电,并播放一个简短的音频剪辑,指示来电者按“1”继续通话。这是打电话推销员的。 备注: > 很难得到一个明确的答案,因为在2012年,Android2.3(姜饼)删除了一些与修改手机状态相关的重要API,见这里。然而,Android7(“牛轧糖”)似乎支持呼叫阻塞(见这里),所以我希望当前的API支持拦截呼叫。 我不想像这里建议的那样将呼叫转发到某个服

  • null 任何帮助都是欢迎的,谢谢。

  • 问题内容: 我有以下动作映射 我可以使用Interceptor中的以下行获取参数映射 就像上面一样, 有什么方法可以获取 以下映射中定义的 拦截器参数 。 动作参数按以下方式定义,动作参数和拦截器参数应分别可访问。 请注意,我不想在拦截器中将参数字段声明为 在Dev Blanked的攻击之后,我实现了他的技术。它没有用,所以我在这里共享我的代码。我正在使用Struts 2.3.1.2。 图书馆 a

  • 问题内容: 我有带有不同(HTML和JSON)结果类型的Struts2操作。他们使用通用拦截器。 如果需要拦截请求,如何根据给定的操作结果类型返回结果? 例如,我转发到JSP页面。如果操作是JSON类型,我想转发JSON错误。 问题答案: 我有带有不同(HTML和JSON)结果类型的Struts2操作。他们使用通用拦截器。如果需要拦截请求,如何根据给定的动作结果类型返回结果? 例如,我的Actio