我有逻辑来拦截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;
}
}
我认为在这种情况下您需要的是一个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