正如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模块中使用。我考虑的另一个选择是使用自定义生成器,但这对于这个非常简单的需求来说似乎太复杂了。
你如何解决这个问题?
答案 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配套项目中所做的事情,例如做表格因素。