【问题标题】:Get maven build info from rest endpoint using Spring xml configuration使用 Spring xml 配置从 rest 端点获取 maven 构建信息
【发布时间】:2019-01-23 18:25:12
【问题描述】:

目前我有这个很棒的工作解决方案:

来自我的 pom.xml:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

资源/mvn.build.properties:

version=${pom.version}
build.timestamp=${timestamp}

BuildInfoProviderImpl.java:

@Service
@PropertySource("classpath:mvn.build.properties")
public class BuildInfoProviderImpl implements BuildInfoProvider {

    @Value("${build.timestamp}")
    private String dateTime;
    @Value("${version}")
    private String version;

    private BuildInfo buildInfo;

    @Override
    public BuildInfo getBuildInfo() {
         return buildInfo;
    }

    @PostConstruct
    public void activate() {
        buildInfo = new BuildInfo(
                LocalDateTime.parse(dateTime, Constants.DATE_TIME_FORMATTER),
                version);
    }
}

HealthEndpoint.java:

@Service
@Path("_health")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public class HealthEndpoint {

    private static final Logger LOGGER = LoggerFactory.getLogger(
        HealthEndpoint.class);

    private BuildInfoProvider buildInfoProvider;

    public HealthEndpoint(BuildInfoProvider buildInfoProvider) {
        this.buildInfoProvider = buildInfoProvider;
    }

    @GET
    public BuildInfo getBuildInfo() {
        LOGGER.debug("Build info has been requested");
        return buildInfoProvider.getBuildInfo();
    }
}

问题是:如何使用xml-configuration文件配置完全相同的东西?

我尝试使用 maven-war-plugin 添加属性,然后从我的服务中获取它,但这根本不起作用。在类路径中看不到它。仅供参考:它在 ${baseFolder}/target/{app}.war 下生成。

我需要这样的东西,但不知何故我必须设置 maven 构建属性,我尝试的一切都失败了:

<bean id="buildInfoProvider" class="service.impl.BuildInfoProviderImpl"/>

<bean id="healthEndpoint" class="endpoint.HealthEndpoint">
    <constructor-arg ref="buildInfoProvider"/>
</bean>

【问题讨论】:

  • 这是 Spring 还是 Spring Boot 应用程序?
  • @khmarbaise Spring

标签: java spring rest maven


【解决方案1】:

您需要在应用程序上下文 xml 中定义 PropertyPlaceholderConfigurer

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
    <value>classpath:mvn.build.properties</value>
</property>

【讨论】:

  • 我试图这样做并将这个值设置为属性,它不起作用。
  • 你注释@PropertySource 有效吗?如果这有效,那么这应该有效,因为两者都在做同样的事情。否则您指定的文件不在类路径中
  • 我不太确定,我应该再试一次,我想我是想通过从 Manifest 获取这个来做到这一点
  • 无法解析值“${maven.build.timestamp}”中的占位符“maven.build.timestamp”
【解决方案2】:

好吧,由于我在这里实际上没有正确答案,所以我将自己提供:

public class HealthEndpoint {

  private static final Logger LOGGER = LoggerFactory.getLogger(HealthEndpoint.class);

  @Context
  private ServletContext context;

  private BuildInfo buildInfo;

  @GET
  public BuildInfo getBuildInfo() {
    LOGGER.debug("Build info has been requested");
    setBuildInfo();
    return buildInfo;
  }

  private void setBuildInfo() {
    if (buildInfo != null) {
        return;
    }
    // some logic of setting build info with help of manifest file here
  }
}

在我的 xml 配置中,我只是创建了这个 bean,如下所示:

<bean id="healthEndpoint" class="endpoint.HealthEndpoint"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 2020-04-20
    • 2020-03-22
    • 2021-07-29
    • 1970-01-01
    • 2019-01-24
    • 2014-04-15
    相关资源
    最近更新 更多