Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Любые определенные типы, которые Вы включаете в свой сервисный интерфейс и любые типы, на которые они ссылаются, будут автоматически добавлены в белый список, пока они реализуют java.io. Сериализуемый, например:
public String getStringForDates(ArrayList<java.util.Date> dates);
приведет к ArrayList и Дате оба включаемый в белый список.
Это становится более хитрым, при попытке использовать java.lang. Объект вместо определенных типов:
public Object getObjectForString(String str);
, поскольку компилятор не знает, что добавить в белый список. В этом случае, если на объекты не ссылаются нигде в Вашем сервисном интерфейсе, необходимо отметить их явно с интерфейсом IsSerializable, иначе это не позволит Вам передать их через механизм RPC.
Белый список сгенерирован компилятором GWT и содержит все записи, которые определяются интерфейсом маркера IsSerializable.
Для добавления типа к списку просто необходимо удостовериться, что класс реализует интерфейс IsSerializable.
Дополнительно для сериализации для работы правильно класс должен иметь значение по умолчанию никакой конструктор аргумента (конструктор может быть частным в случае необходимости). Также, если класс является внутренним, он должен быть отмечен как статичный.
Есть обходной путь: определите новый класс Dummy
с полями-членами всех типов, которые вы хотите включить в сериализацию. Затем добавьте метод в свой интерфейс RPC:
Dummy dummy(Dummy d);
Реализация такова:
Dummy dummy(Dummy d) { return d; }
А асинхронный интерфейс будет иметь это:
void dummy(Dummy d, AsyncCallback< Dummy> callback);
Компилятор GWT подберет это, и потому что Dummy
class ссылается на эти типы, он будет включать их в белый список.
Пример Dummy
class:
public class Dummy implements IsSerializable {
private java.sql.Date d;
}
ИМХО, самый простой способ программного доступа к белому списку - это создать класс, подобный этому:
public class SerializableWhitelist implements IsSerializable {
String[] dummy1;
SomeOtherThingsIWishToSerialize dummy2;
}
Затем включить его в пакет .client
и ссылку из службы RPC. (поэтому он анализируется компилятором.)
Я не мог найти лучшего способа разрешить передачу непараметризованных карт, что, очевидно, иногда требуется для создания более общих служб ...
, чтобы обеспечить желаемый результат, удалите все war /
Всем, кто задаст тот же вопрос и не найдет предыдущие ответы удовлетворительными ...
Я использую GWT с GWTController, так как я использую Spring, который я модифицировал как описано в этом сообщении . В сообщении объясняется, как изменить GrailsRemoteServiceServlet, но GWTController вызывает RPC.decodeRequest () и RPC.encodeResponseForSuccess () таким же образом.
Это последняя версия GWTController, которую я использую:
/**
* Used to instantiate GWT server in Spring context.
*
* Original version from <a href="http://docs.google.com/Doc?docid=dw2zgx2_25492p5qxfq&hl=en">this tutorial</a>.
*
* ...fixed to work as explained <a href="http://blog.js-development.com/2009/09/gwt-meets-spring.html">in this tutorial</a>.
*
* ...and then fixed to use StandardSerializationPolicy as explained in
* <a href="http://markmail.org/message/k5j2vni6yzcokjsw">this message</a> to allow
* using Serializable instead of IsSerializable in model.
*/
public class GWTController extends RemoteServiceServlet implements Controller, ServletContextAware {
// Instance fields
private RemoteService remoteService;
private Class<? extends RemoteService> remoteServiceClass;
private ServletContext servletContext;
// Public methods
/**
* Call GWT's RemoteService doPost() method and return null.
*
* @param request
* The current HTTP request
* @param response
* The current HTTP response
* @return A ModelAndView to render, or null if handled directly
* @throws Exception
* In case of errors
*/
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
doPost(request, response);
return null; // response handled by GWT RPC over XmlHttpRequest
}
/**
* Process the RPC request encoded into the payload string and return a string that encodes either the method return
* or an exception thrown by it.
*
* @param payload
* The RPC payload
*/
public String processCall(String payload) throws SerializationException {
try {
RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass, this);
// delegate work to the spring injected service
return RPC.invokeAndEncodeResponse(this.remoteService, rpcRequest.getMethod(), rpcRequest.getParameters(), rpcRequest.getSerializationPolicy());
} catch (IncompatibleRemoteServiceException e) {
return RPC.encodeResponseForFailure(null, e);
}
}
/**
* Setter for Spring injection of the GWT RemoteService object.
*
* @param RemoteService
* The GWT RemoteService implementation that will be delegated to by the {@code GWTController}.
*/
public void setRemoteService(RemoteService remoteService) {
this.remoteService = remoteService;
this.remoteServiceClass = this.remoteService.getClass();
}
@Override
public ServletContext getServletContext() {
return servletContext;
}
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
}
Белый список создается компилятором gwt и содержит все записи, обозначенные интерфейсом маркера IsSerializable.
Чтобы добавить тип в список, вам просто нужно убедиться, что класс реализует интерфейс IsSerializable.
- Андрей
Это, вероятно, самое простое решение. Единственное, что нужно помнить при этом, это то, что все классы, которые вы хотите сериализовать, должны иметь конструктор "общедоступный, без аргументов" и (в зависимости от требований) методы установки для полей-членов.