使用编译时环境变量来配置RestApplicationPath

时间:2014-07-10 16:44:47

标签: java gwt gwtp gwt-platform gin

正如rest-dispatch的文档中所述,必须通过常量在GIN模块中配置其余的应用程序路径,此处为“/ api / v1”:

public class DispatchModule extends AbstractGinModule {
   @Override
   protected void configure() {
       RestDispatchAsyncModule.Builder dispatchBuilder = 
               new RestDispatchAsyncModule.Builder();
       install(dispatchBuilder.build());
       bindConstant().annotatedWith(RestApplicationPath.class).to("/api/v1");   
   }
}

我想在编译时根据构建系统根据目标环境(prod,dev等等)设置的环境变量来解析“/ api / v1”常量,并且其他标准(构建工件主要版本......)。

问题是我无法依赖编译时变量。 TextResource / CssResource和GWT的deferred binding都不会有帮助,因为GWT.create()不能在GIN模块中使用。我考虑的另一个选择是使用自定义生成器,但这对于这个非常简单的需求来说似乎太复杂了。

你如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

如果您使用Maven作为构建系统,则可以利用templating-maven-plugin生成一个Java类,该类将包含POM文件中定义的静态变量。生成的类将由您的GWT代码使用。

例如,您可能希望填充BuildConstants类模板

public class BuildConstants {
  // will be replaced by Maven
  public static final String API_VERSION  = "${myapi.version}";
}

并使用Maven属性:

<myapi.version>v1</myapi.version>

将编译为

public class BuildConstants {
  // will be replaced by Maven
  public static final String API_VERSION  = "v1";
}

您可以在DispatchModule

中引用这些常量
bindConstant().annotatedWith(RestApplicationPath.class).to("/api/" + BuildConstants.API_VERSION);   

这是我在项目中使用的templating-maven-plugin的示例配置:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>templating-maven-plugin</artifactId>
  <version>1.0-alpha-3</version>
  <executions>
    <execution>
      <id>filter-src</id>
      <goals>
        <goal>filter-sources</goal>
      </goals>
      <configuration>
        <sourceDirectory>${basedir}/src/main/java-templates</sourceDirectory>
        <outputDirectory>${project.build.directory}/generated-sources/java-templates
        </outputDirectory>
      </configuration>
    </execution>
   </executions>
</plugin>

答案 1 :(得分:1)

您无法使用bindConstant()方法(或其他@Provides)替换bind().toProvider(),这样您就可以使用TextResource和/或延迟 - 绑定,或其他什么。

作为一个例子(虽然未经测试),下面的代码使用JSNI从主页中读取值,这使得它依赖于运行时(而不是编译时):

@Provides @RestApplicationPath native String provideRestApplicationPath() /*-{
  return $wnd.restApplicationPath;
}-*/;

答案 2 :(得分:0)

根据Thomas Broyer的建议和Simon-Pierre,您甚至可以根据您的maven配置文件绑定不同的根.gwt.xml文件。然后选择适当的Gin模块类来绑定常量。

这就是我们在GWTP的CarStore配套项目中所做的事情,例如做表格因素。