【问题标题】:How to override parent method in spring xml configuration?如何在spring xml配置中覆盖父方法?
【发布时间】:2018-07-14 23:33:56
【问题描述】:

出于某种原因,我的团队使用 Spring XML 配置而不是 Java 配置。当我实现一个新的CorsFilter 时,我用谷歌搜索并找到了示例 Java Config,如下所示:

@Component
public class CorsFilter extends OncePerRequestFilter {

   @Override
   protected void doFilterInternal(final HttpServletRequest request,
                                   final HttpServletResponse response,
                                   final FilterChain filterChain) throws ServletException, IOException {
       response.addHeader("Access-Control-Allow-Origin", "*");
       response
               .addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, PATCH, HEAD, OPTIONS");
       response.addHeader("Access-Control-Allow-Headers",
               "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
       response.addHeader("Access-Control-Expose-Headers",
               "Access-Control-Allow-Origin, Access-Control-Allow-Credentials");
       response.addHeader("Access-Control-Allow-Credentials", "true");
       response.addIntHeader("Access-Control-Max-Age", 10);
       filterChain.doFilter(request, response);
   }
}

但是如何转换成等效的 Spring XML 配置呢?我知道我们可以创建一个名为corsFilter 的bean 并设置一些属性值。但是如何在 XML 配置中覆盖父方法并执行带有副作用的操作呢? (如在上面添加标题)

【问题讨论】:

    标签: java xml spring javabeans


    【解决方案1】:

    如果你想移动 spring xml 中的所有 header 配置,你可以在 xml 中创建一个Map 对象,然后将其设置为CorsFilter 的属性并在doFilterInternal 方法中读取相同的内容。

    //add a spring util namespace xmlns:util="http://www.springframework.org/schema/util
    //schemaLocation http://www.springframework.org/schema/util
    <util:map id="headerMap" map-class="java.util.HashMap">
        <entry key="Access-Control-Allow-Origin">
            <value>*</value>
        </entry> ....so on
    </util:map>
    
    <bean id="corsFilter" class="CorsFilter">
        <property name="header" ref="headerMap"/>
    </bean>
    
    public class CorsFilter extends OncePerRequestFilter {
       Map<String,String> header;
    
       @Override
       protected void doFilterInternal(final HttpServletRequest request,
                                       final HttpServletResponse response,
                                       final FilterChain filterChain) throws ServletException, IOException {
            for(Entry<String,String> entry : header.entrySet()){
              response.addHeader(entry.getKey(), entry.getValue());
            }
           filterChain.doFilter(request, response);
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2011-06-10
      • 2020-07-22
      • 2012-12-07
      • 2022-06-21
      相关资源
      最近更新 更多