You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将build.gradle中timestamp属性传递至application.properties并解决空指针异常

问题解决步骤

一、解决BuildProperties空指针异常

你的AppFilter是Servlet过滤器,默认由Web容器(如Tomcat)初始化,不属于Spring上下文管理对象,因此@Autowired无法完成注入,导致空指针。按以下方式修改:

  1. 给AppFilter添加@Component注解,让Spring接管实例创建:
import org.springframework.boot.info.BuildProperties;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class AppFilter implements Filter {
    private final BuildProperties buildProperties;

    // 优先使用构造方法注入(Spring推荐方式,避免@Autowired依赖)
    public AppFilter(BuildProperties buildProperties) {
        this.buildProperties = buildProperties;
    }

    @Override
    public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 注意:这里直接用"timestamp"而非"build.timestamp",BuildProperties会自动映射build-info.properties中build.前缀的属性
        String timestamp = buildProperties.get("timestamp");
        System.out.println("Timestamp=>" + timestamp);
        chain.doFilter(request, response);
    }
}
  1. 注册过滤器(如果未通过@ServletComponentScan或配置类注册):
    创建配置类手动注册过滤器:
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<AppFilter> appFilterRegistration(AppFilter appFilter) {
        FilterRegistrationBean<AppFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(appFilter);
        registration.addUrlPatterns("/*"); // 配置过滤器拦截路径
        registration.setOrder(1); // 设置执行顺序
        return registration;
    }
}

二、将Gradle构建的timestamp传递到application.properties

需要配置Gradle的processResources任务,在编译阶段替换application.properties中的占位符:

修改build.gradle,添加processResources配置:

def timestamp = new Date().format('yyyyMMddHHmm')
println "Timestamp:" + timestamp

springBoot {
    mainClass = 'com.example.login.Application'
    buildInfo {
        properties {
            additionalProperties = [
                    'timestamp': "${timestamp}"
            ]
        }
    }
}

// 新增:处理资源文件,替换application.properties中的占位符
processResources {
    filesMatching('application.properties') {
        // 将@timestamp@替换为gradle中定义的timestamp变量
        expand(timestamp: timestamp)
    }
}

修改后,执行gradle build时,application.properties中的current.timestamp=@timestamp@会被自动替换为实际的构建时间戳,比如current.timestamp=202307111234。

验证

  1. 执行gradle clean build构建项目;
  2. 查看build/resources/main/application.properties,确认current.timestamp已替换为正确值;
  3. 启动项目,过滤器中会正常打印出构建时间戳,不再出现空指针异常。

内容的提问来源于stack exchange,提问作者Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:52:49