如何将build.gradle中timestamp属性传递至application.properties并解决空指针异常
问题解决步骤
一、解决BuildProperties空指针异常
你的AppFilter是Servlet过滤器,默认由Web容器(如Tomcat)初始化,不属于Spring上下文管理对象,因此@Autowired无法完成注入,导致空指针。按以下方式修改:
- 给
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); } }
- 注册过滤器(如果未通过
@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。
验证
- 执行
gradle clean build构建项目; - 查看
build/resources/main/application.properties,确认current.timestamp已替换为正确值; - 启动项目,过滤器中会正常打印出构建时间戳,不再出现空指针异常。
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

