2016-11-10 14 views
0

Могу ли я использовать объекты ConstraintViolation или ConstraintViolationException в моих возвращаемых значениях обратного вызова async с помощью RPC (GWT 2.5)?Проверка на стороне сервера GWT и сериализация RPC

Я впервые попробовал ConstraintViolation и GWT не хотел этого, потому что (я думаю) ConstraintViolation не имеет конструктора без параметров.

Я тогда попытался ConstraintViolationException, и он тоже не работает по другой причине (см. Ниже трассировку).

У меня есть необходимость в уловки исключений (ConstraintViolationException) вместо использования возвращаемых значений?

com.google.gwt.user.client.rpc.SerializationException: Type 'org.hibernate.validator.engine.ConstraintViolationImpl' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = ConstraintViolationImpl{interpolatedMessage='{contact.validcompanyorperson}', propertyPath=, rootBeanClass=class com.mycompany.shared.foo.bar.MyBean, messageTemplate='{contact.validcompanyorperson}'} 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:667) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:44) 
    at com.google.gwt.user.client.rpc.core.java.util.HashSet_CustomFieldSerializer.serialize(HashSet_CustomFieldSerializer.java:39) 
    at com.google.gwt.user.client.rpc.core.java.util.HashSet_CustomFieldSerializer.serializeInstance(HashSet_CustomFieldSerializer.java:51) 
    at com.google.gwt.user.client.rpc.core.java.util.HashSet_CustomFieldSerializer.serializeInstance(HashSet_CustomFieldSerializer.java:28) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:788) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:669) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at javax.validation.ConstraintViolationException_CustomFieldSerializer.serialize(ConstraintViolationException_CustomFieldSerializer.java:49) 
    at javax.validation.ConstraintViolationException_CustomFieldSerializer.serializeInstance(ConstraintViolationException_CustomFieldSerializer.java:72) 
    at javax.validation.ConstraintViolationException_CustomFieldSerializer.serializeInstance(ConstraintViolationException_CustomFieldSerializer.java:28) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:788) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:669) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:153) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:587) 
    at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:605) 
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:471) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:563) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1083) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:640) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source) 

20161114 UPDATE: Я из идей. Я попытался скопировать ConstraintViolationImpl (hibernate-validator-4.1.0's) в свой собственный исходный файл, посылая это по кабелю. Не будет работать, потому что «com.google.gwt.user.client.rpc.SerializationException: тип« com.mycompany.common.gwt.ui.shared.GwtConstraintViolation »не был включен в набор типов, которые могут быть сериализованы этим Объект SerializationPolicy или его объект класса нельзя загрузить ». Более подробная информация приведена ниже (консоль разработки Eclipse Development Mode).

[DEBUG] [foo_bar] - Rebinding com.mycompany.IHM.client.gwt.foo.client.service.FooService 
    [DEBUG] [foo_bar] - Invoking generator com.google.gwt.user.rebind.rpc.ServiceInterfaceProxyGenerator 
     [DEBUG] [foo_bar] - Generating client proxy for remote service interface 'com.mycompany.IHM.client.gwt.foo.client.service.FooService' 
      [DEBUG] [foo_bar] - Analyzing 'com.mycompany.IHM.client.gwt.foo.client.service.FooService' for serializable types 
       [DEBUG] [foo_bar] - Analyzing methods: 
        [DEBUG] [foo_bar] - public abstract java.util.Set<com.mycompany.commun.gwt.ui.shared.GwtConstraintViolation<com.mycompany.IHM.client.gwt.foo.shared.pack.MyBean>> getConstraintViolations2(com.mycompany.IHM.client.gwt.foo.shared.pack.MyBean saisie) 
         [DEBUG] [foo_bar] - Return type: java.util.Set<com.mycompany.commun.gwt.ui.shared.GwtConstraintViolation<com.mycompany.IHM.client.gwt.foo.shared.pack.MyBean>> 
          [DEBUG] [foo_bar] - java.util.Set<com.mycompany.commun.gwt.ui.shared.GwtConstraintViolation<com.mycompany.IHM.client.gwt.foo.shared.pack.MyBean>> 
           [DEBUG] [foo_bar] - Verifying instantiability 
            [DEBUG] [foo_bar] - java.util.TreeSet<com.mycompany.commun.gwt.ui.shared.GwtConstraintViolation<com.mycompany.IHM.client.gwt.foo.shared.pack.MyBean>> 
             [DEBUG] [foo_bar] - Checking parameters of 'java.util.TreeSet<com.mycompany.commun.gwt.ui.shared.GwtConstraintViolation<com.mycompany.IHM.client.gwt.foo.shared.pack.MyBean>>' 
              [DEBUG] [foo_bar] - Checking type argument 0 of type 'java.util.TreeSet<E>' because it is directly exposed in this type or in one of its subtypes 
               [DEBUG] [foo_bar] - com.mycompany.commun.gwt.ui.shared.GwtConstraintViolation<com.mycompany.IHM.client.gwt.foo.shared.pack.MyBean> 
                [DEBUG] [foo_bar] - Verifying instantiability 
                 [DEBUG] [foo_bar] - com.mycompany.commun.gwt.ui.shared.GwtConstraintViolation<com.mycompany.IHM.client.gwt.foo.shared.pack.MyBean> 
                  [DEBUG] [foo_bar] - Analyzing the fields of type 'com.mycompany.commun.gwt.ui.shared.GwtConstraintViolation<com.mycompany.IHM.client.gwt.foo.shared.pack.MyBean>' that qualify for serialization 
                   [DEBUG] [foo_bar] - private javax.validation.Path propertyPath 
                    [DEBUG] [foo_bar] - javax.validation.Path 
                     [DEBUG] [foo_bar] - Verifying instantiability 
                      [DEBUG] [foo_bar] - com.google.gwt.validation.client.impl.PathImpl 
                       [DEBUG] [foo_bar] - Analyzing the fields of type 'com.google.gwt.validation.client.impl.PathImpl' that qualify for serialization 
                        [WARN] [foo_bar] - Field 'private final java.util.List<javax.validation.Path.Node> nodes' will not be serialized because it is final 

GwtConstraintViolation определяется как 'общественный класс GwtConstraintViolation реализует ConstraintViolation, IsSerializable' (Содержимое копипаст из Hibernate Validator). Я прокомментировал поле «Объект», потому что знаю, что GWT это не нравится.

+0

Вы пытались добавить конструктор по умолчанию к своей собственной реализации ConstraintViolationException? – Bob

+0

Я вообще исключил исключения и возвращаю Set of ConstraintViolation (это то же самое, ConstraintViolationException - не что иное, как класс обертки). Yep, GwtConstraintViolation имеет конструктор без параметров. – Toto

+0

Похоже, что пользовательский сериализатор GWT для ConstraintViolationImpl отбрасывает достаточное количество информации (см. Https://github.com/vaadin/gwt/blob/master/user/src/org/hibernate/validator/engine/ConstraintViolationImpl_CustomFieldSerializer.java). Кажется, некоторые из этих полей необходимы для моего кода, созданного редактором/драйвером, для корректного отображения сообщений об ошибках (я тестировал проверку тех же ограничений на стороне клиента, они работают. Затем, размер клиента, я создал «поддельный» неполный ConstrainViolation из полного ConstraintViolation objects: не работает). Мне нужно будет посмотреть, с какими полями я могу работать. – Toto

ответ

0

Нет, согласно GWT documentation, вы можете исключать исключения из методов RPC.

Точная обработка зависит от типа исключения:

  • за проверяемые исключения этого достаточно, чтобы иметь их в списке throws в подписи метода
  • непроверенные исключения завернутые в InvocationException. Исходное исключение регистрируется на стороне сервера.

Я думаю, что в вашем случае ConstraintViolationException является беспрепятственным исключением. Он должен быть «захватывающим» как InvocationException на стороне клиента. Столбец, который вы опубликовали, должен быть только выходным протоколом на стороне сервера.

Если вы хотите продолжить обработку исключенного исключения на стороне клиента, я бы предложил вам включить его в собственное проверенное исключение и выбросить его из вашего метода RPC.

+0

Это все правда (и я знаю это), но это не то, о чем мой вопрос. Все, что я хочу сделать, это иметь ConstraintViolation, ConstraintViolationException или любой другой тип с эквивалентной функциональностью в моей сигнатуре методов RPC, не испортив мою текущую логику onFailure/onSuccess. У меня создается впечатление, что методы GWT RPC подходят для того, чтобы бросать типы, которые GWT откажется в качестве возвращаемых значений? (что удивительно для меня, это очень противоречиво). И да, я пытаюсь обновить свой код, чтобы использовать исключения, так как кажется, что у меня нет выбора в любом случае (скоро добавит обновление). – Toto

+0

Вы пробовали листинг ConstraintViolationException в 'throws'-Part вашего метода? – Bob

+0

Это дает мне ту же ошибку :((и я получаю клиентскую часть StatusCodeException вместо ожидаемого ConstraintViolationException). Я не понимаю этого, даже официальный пример GWT (см. Http://www.gwtproject.org/doc/latest/ DevGuideValidation.html) Работает так же! – Toto