Хорошо, я запустил некоторые мои собственные тесты.
mysql_connect()
функция (или некоторая другая ссылка на некоторый другой RDBMS), пока Вы отмечаете частный экземпляр, нет никакой угрозы кого-то разделяющего его на подклассы и вмешивающийся в ссылку. Я почти уверен, что правильный ответ здесь - исправить источник и отправить отчет об ошибке. Другой вариант - запустить приложение GWT по адресу /
на вашем сервере.
Я бы предпочел первое, но второе тоже должно работать. Если вам действительно нужно разделить вещи на несколько контекстов, используйте другой номер порта?
Я столкнулся с аналогичной проблемой, успешным решением было заставить все сериализованные объекты реализовать интерфейс IsSerializable GWT (в дополнение к стандартному интерфейсу Serializable). Если вы читаете сообщение, в нем говорится, что «будет использоваться устаревшая, совместимая с 1.3.3 политика сериализации» - совместимая с 1.3.3 политика требует, чтобы все ваши сериализованные объекты реализовали интерфейс IsSerializable, поэтому, добавив его, все заработало.
У меня действительно есть опасения, что устаревшая политика не будет поддерживаться в будущих версиях GWT, поэтому я также ищу лучший способ обхода проблемы.
У меня такая же проблема, и я открыл отчет об ошибке:
http://code.google.com/p/google-web-toolkit/issues/detail?id=4817
Проблема в том, что он был помечен как "As Design", поэтому я не думаю, что он будет исправлен.
Я нашел для себя следующее решение. Я расширил класс RemoteServiceServlet и заставил GWT загружать файл политики сериализации, начиная с ContextName вместо URL. Затем я расширил свой сервис своим классом вместо класса RemoteServiceServlet. Таким образом, приложение будет отвязано от URL, с которого оно будет вызываться.
Вот мой пользовательский класс:
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.google.gwt.user.server.rpc.SerializationPolicy;
import com.google.gwt.user.server.rpc.SerializationPolicyLoader;
public class MyRemoteServiceServlet extends RemoteServiceServlet
{
@Override
protected SerializationPolicy doGetSerializationPolicy(HttpServletRequest request, String moduleBaseURL, String strongName)
{
return MyRemoteServiceServlet.loadSerializationPolicy(this, request, moduleBaseURL, strongName);
}
/**
* Used by HybridServiceServlet.
*/
static SerializationPolicy loadSerializationPolicy(HttpServlet servlet,
HttpServletRequest request, String moduleBaseURL, String strongName) {
// The serialization policy path depends only by contraxt path
String contextPath = request.getContextPath();
SerializationPolicy serializationPolicy = null;
String contextRelativePath = contextPath + "/";
String serializationPolicyFilePath = SerializationPolicyLoader.getSerializationPolicyFileName(contextRelativePath
+ strongName);
// Open the RPC resource file and read its contents.
InputStream is = servlet.getServletContext().getResourceAsStream(
serializationPolicyFilePath);
try {
if (is != null) {
try {
serializationPolicy = SerializationPolicyLoader.loadFromStream(is,
null);
} catch (ParseException e) {
servlet.log("ERROR: Failed to parse the policy file '"
+ serializationPolicyFilePath + "'", e);
} catch (IOException e) {
servlet.log("ERROR: Could not read the policy file '"
+ serializationPolicyFilePath + "'", e);
}
} else {
String message = "ERROR: The serialization policy file '"
+ serializationPolicyFilePath
+ "' was not found; did you forget to include it in this deployment?";
servlet.log(message);
}
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
// Ignore this error
}
}
}
return serializationPolicy;
}
}