我正在尝试使用maven配置文件提供的功能来为不同的服务器环境构建自定义版本。我正在尝试做的是组合maven资源过滤
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
使用它的配置文件机制
<profiles>
<profile>
<id>mock</id>
<properties>
<application-url>http://mock-server-url</application-url>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
在名为server.cfg
${application-url}
我可以在这里使用的东西:
public interface ServerResource extends ClientBundle {
public static final ServerResource INSTANCE = GWT.create(ServerResource.class);
@Source("server.cfg")
public TextResource server();
}
我可以看到该值已在WEB-INF / classes中被替换,但似乎GWT没有使用该替换文件来创建应用程序javascript。我怎么能这样做?
答案 0 :(得分:1)
使用GWT编译器排列来应用这种配置在我看来是一个非常糟糕的主意。关于GWT最常见的抱怨之一是编译所需的时间,通过这样做你只是增加了问题。
配置通常应该从配置文件中读取(惊喜!),例如shown here。
无论如何,你想要做的事在我看来是不可能的。您无法告诉客户端代码它应该连接到哪个服务器。这会违反same-origin policy!该应用只能与它来自的服务器进行通信。
要让不同的应用程序在不同的URL中运行,您需要部署多个具有不同名称的GWT应用程序(即使它们基本相同)。然后,您只需在浏览器中为每个应用程序(版本)键入正确的URL,它将“查看”正确的应用程序。所以你可以拥有这样的网址:
http://myserver.com/app1
http://myserver.com/app2
为了向与GWT应用程序在同一服务器上运行的其他应用程序发出请求,您可以执行以下操作:
String serviceUrl = "/app2/someService"; // or some other String sourced from a config file, using a GWT ClientResource for example
RequestBuilder rb = new RequestBuilder(RequestBuilder.GET,
serviceUrl);
try {
// send request from app1 to app2
rb.sendRequest(null, new RequestCallback() {
@Override
public void onResponseReceived(Request request,
Response response) {
log.info("Response: " + response.getStatusText());
// if response is 200 it's ok, you can read the outputStream to see what's in there
}
@Override
public void onError(Request request, Throwable exception) {
log.warning("Request Error", exception);
// do something more
}
});
} catch (RequestException e) {
log.warning("Request Exception", e);
// getting here means trouble with the connection or service!
}
答案 1 :(得分:1)
我在没有使用maven配置文件或GWT ClientBundle的情况下解决了我想要完成的任务(我从未按照我在撰写问题时的预期方式开始工作)。
以下是我希望使用maven配置文件解决的主要问题以及我用来解决手头问题的解决方法:
在托管模式下使用模拟MVP模型
// inside the initialization for my model locator
boolean hostedMode = GWT.getPermutationStrongName().equals("HostedMode");
if (hostedMode) {
// instantiate mock models
} else {
// instantiate real models to call REST web services
}
为实际模型提供正确的REST服务器网址
我能够实现这一点,因为我的GWT应用程序和RESTful Web服务URL遵循一套设定的命名约定。我基本上从URL中删除了尾部'/'并追加'_services'
String createServicesBaseUrl() {
StringBuffer baseUrl = new StringBuffer(GWT.getHostPageBaseURL());
int length = baseUrl.length();
baseUrl.replace(length-1, length, "_services");
return baseUrl.toString();
}
尽可能多地测试MVP演示者(活动和地点)
我已经将模型定位器注入到我的Activity
类中,因此使用模拟模型定位器替换它以供JUnit使用是很简单的。我为我的观点做了同样的事情,并抽象出了一些似乎在浏览器之外不起作用的其他代码(如GWT PlaceController
)。
总而言之,我的构建大致相同,但我学会了如何在测试中获得很大的灵活性,配置我的GWT应用程序连接的服务器实例,以及我的应用程序使用的模型(取决于托管与服务器模式)