为什么@EnableWs从spring bean中删除aop代理

2023-12-01

我正在尝试在我的 Spring Boot Web 服务项目中添加自定义拦截器。我跟随this示例并创建了此配置:

package org.example;

import java.util.List;

import org.aspect.PersistentAspect;
import org.springframework.aop.support.AopUtils;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.ws.config.annotation.EnableWs;
import org.springframework.ws.config.annotation.WsConfigurerAdapter;
import org.springframework.ws.server.EndpointInterceptor;
import org.springframework.ws.transport.http.MessageDispatcherServlet;
import org.springframework.xml.xsd.SimpleXsdSchema;
import org.springframework.xml.xsd.XsdSchema;

@EnableWs
@Configuration
public class WsConfig extends WsConfigurerAdapter {

    @Bean
    public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
        final MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        return new ServletRegistrationBean(servlet, "/v1/*");
    }

    @Bean
    public XsdSchema schema() {
        return new SimpleXsdSchema(new ClassPathResource("country.xsd"));
    }

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        String[] jaxbContext = new String[] { "io.spring.guides.gs_producing_web_service" };
        marshaller.setContextPaths(jaxbContext);
        return marshaller;
    }

    @Override
    public void addInterceptors(List<EndpointInterceptor> interceptors) {
        // aop not working
        interceptors.add(new CustomValidatingInterceptor(schema(), config()));
        // aop working
        // interceptors.add(new CustomValidatingInterceptor(schema(), null));
    }

    @Bean
    public AppConfig config() {
        return new AppConfig();
    }

    @Bean
    public PersistentAspect persistentAspect() {
        PersistentAspect persistentAspect = new PersistentAspect();
        return persistentAspect;
    }

    @Bean
    public Object testAop() {
        System.out.println("is config aop proxy: " + AopUtils.isAopProxy(config()));

        return null;
    }
}

但是当我添加新的拦截器时addInterceptors方法 我在配置类中删除 aop 代理时遇到问题。知道为什么吗?整个项目已启动git.


问题出在Spring的初始化顺序上。从技术上来说,因为有一个BeanPostProcessor对于 WS 端点(AnnotationActionEndpointMapping在 spring-ws 中),它将强制提前初始化所需的任何依赖项 - 特别是任何依赖项EndpointInterceptor beans.

解决这个问题的一种方法是重新排列 BeanPostProcessor,甚至创建您自己的 BeanPostProcessor,但通常更简单的是保留 Spring 中的默认配置 - 以避免初始化序列中其他地方出现类似的意外情况。

也许避免该问题的更简单方法是使用ObjectFactory in the EndpointInterceptor豆。这将延迟实例化AppConfigbean 直到它被引用,此时 Aop 编织也将发生。

@Component
public class CustomValidatingInterceptor extends PayloadValidatingInterceptor {

    @Autowired
    private ObjectFactory<AppConfig> konfigurace;

    @Override
    public boolean handleRequest(MessageContext messageContext, Object endpoint)
            throws IOException, SAXException, TransformerException {
        System.out.println("is config aop proxy in interceptor: " +
                AopUtils.isAopProxy(konfigurace.getObject()));
        return super.handleRequest(messageContext, endpoint);
    }

显然,这意味着CustomValidatingInterceptor必须引用自WsConfig作为注入(自动装配)的 bean。

谢谢你的例子 - 有一个叉子here使用的是ObjectFactory技术。这表明configbean 作为 Aop 代理在所有WsConfig.testAop(), the CountryEndpointCustomValidatingInterceptor当我从 SoapUI 发送请求时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么@EnableWs从spring bean中删除aop代理 的相关文章

  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 使用Spring将war文件WEB-INF目录下的资源导入到applicationContext文件中

    我在我的项目中使用 Spring 框架 我想导入下面的所有 xml 资源 文件 WEB INF CustomerService spring integration Jobs applicationContext配置文件中war文件的目录
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • 当覆盖范围减少时,SonarQube 质量门将失败

    我正在使用 SonarQube 4 3 并尝试让质量门 以前称为警报 工作 但当集成测试覆盖率自上次分析以来减少时 该质量门就会失败 有谁知道如何做到这一点 好的 就是这样 设置 覆盖范围 自上次分析以来的增量 小于 0 如果这会导致错误
  • 最近发布的 GAE PHP 运行时可以访问本机 GAE 数据存储吗?

    Google 刚刚宣布支持 App Engine 的 PHP 运行时 我有一个使用 Java 运行时开发的应用程序 它利用本机 App Engine 数据存储区 它目前充当移动客户端的后端 我们正在考虑开发一个单独的 Web 前端 它需要与
  • Python 2 中的整数数组输入

    我是Python新手 我想获取 2 个大小为 4 的整数数组 a 和 b 的用户输入并打印它们 输入应该以空格分隔 第一个用户应该像这样输入数组 a 1 2 3 4 他应该像这样输入数组 b 2 3 4 6 程序应该将 a 和 b 显示为输
  • 优化我的模拟数据库的代码

    我一直在写一个程序 模拟一个小型数据库 可以在其中进行查询 写完代码后 我已经执行了它 但性能相当糟糕 它的工作速度真的很慢 我尝试过改进它 但几个月前我就开始自学C 所以我的知识还很低 所以我想找到一种解决方案来提高性能 让我解释一下我的
  • 选择 pandas 列时出现 KeyError

    我正在尝试将 CSV 文件读入 pandas 数据帧并选择一列 但不断出现关键错误 文件读入成功 我可以在 iPython 笔记本中查看数据帧 但是当我想选择第一列以外的任何列时 它会引发关键错误 我正在使用这段代码 import pand
  • JPA ManyToMany Join Table 的所有属性均为 PK

    我正在使用 Hibernate 3 3 1 并遵循建模这个示例表结构 但我在创建具有额外属性的连接表时遇到问题 这是多对多的关系Order and Product桌子 连接表是Order Detail桌子 我遵循了提到的方法here 现在我
  • 以编程方式导航到另一个视图控制器/场景

    从第一个视图控制器导航到第二个视图控制器时收到错误消息 我的编码是这样的 let vc LoginViewController nibName LoginViewController bundle nil self navigationCo
  • “惯用的”哈斯克尔型不等式

    从上一个问题编辑 我认为下面的代码不起作用 我希望实现一个 haskell 函数 f 它有一个限制 即它的 2 个参数不能具有相同的类型 我使用了以下代码 LANGUAGE MultiParamTypeClasses FunctionalD
  • 使用 contains 的 Linq 查询不起作用

    我想在 LINQ 中使用查询并使用类似于 TSQL 中 LIKE 的函数 例如 SELECT salary FROM employees WHERE last name LIKE R 我正在尝试在 LINQ to Oracle DB 中进行
  • 如何让android模拟器访问我的电脑文件?

    谁能告诉我如何让 android 模拟器访问我电脑的媒体文件 我不知道如何在两者之间建立连接 请帮助我 提前致谢 您可以查看这篇文章 了解有关将文件从 PC 推送到 Android 模拟器的信息 如何将文件导入Android模拟器上的SD卡
  • 让 FEST 等待应用程序加载

    我是基于 FEST 的 GUI 测试的新手 MyFrame 是我的应用程序的根类 Before public void onSetUp MyFrame frame GuiActionRunner execute new GuiQuery
  • “./”(点斜线)在 HTML 文件路径位置中指什么?

    I know 意思是走上一条路 但是什么意思 确切的意思是 我最近正在浏览一个教程 它似乎只是指同一位置的一个文件 所以有必要吗 如果这就是它所做的一切 我可以不使用它吗 表示当前驱动器的根目录 表示当前目录 表示当前目录的父目录
  • tabbar-mode 使编辑变得缓慢停止

    我今天尝试了 tabbar mode 版本 2 0 1 可以通过 marmelade elpa 存储库获得 版本 2 0 来自多尔姆斯 github 存储库 当标签栏模式被激活时 击键明显滞后 我想说 gt 1 秒 我使用 emacs 24
  • 在 ReduxReducer 中执行 Ajax 获取?

    我正在尝试访问 Redux actionCreators 内的状态 相反 执行了以下操作 在减速器中执行ajax操作 为什么我需要为此访问状态 因为我想使用存储在状态中的 CSRF 令牌来执行 ajax 有人可以告诉我以下是否被认为是不好的
  • 如何在java中将UTF-16转换为UTF-32?

    我一直在寻找解决方案 但似乎没有太多关于这个主题的内容 我找到了建议的解决方案 String unicodeString new String utf8 here byte bytes String getBytes UTF8 String
  • beforeRequest事件jqGrid:在调用url之前设置jqGrid页面

    我试图在对 URL 的 GET 请求之前设置 jqGrid 中的页面变量 jQuery frTable jqGrid cmTemplate sortable false caption TempData POPNAME Population
  • Rust OpenTelemetry OTLP 带 Honeycomb

    我正在尝试使用opentelemetry and open telemetry otlp通过 OTLP 向 Honeycomb 提供可观测性数据 我使用这样的东西作为概念证明 如果你想运行它 可以将其提取到此存储库中 https githu
  • 使列表不可变[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的不可变列表 是否可以使列表不可变 您可以使用ReadOnlyCollection
  • 表单提交无需刷新页面

    有人可以告诉我使用教程吗jquery显示表单提交成功 无需刷新页面 当邮件发送时 gmail 上会发生类似的情况 黄色叠加层显示您的邮件已发送 然后淡出 我希望根据表单提交的结果显示消息 好的 类似这样的 但我没有尝试 所以像教程一样使用它
  • 为什么@EnableWs从spring bean中删除aop代理

    我正在尝试在我的 Spring Boot Web 服务项目中添加自定义拦截器 我跟随this示例并创建了此配置 package org example import java util List import org aspect Pers