2016-11-10 10 views
0

RPC(GWT 2.5)で非同期コールバックの戻り値にConstraintViolationまたはConstraintViolationExceptionオブジェクトを使用できますか?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またはそのClassオブジェクトをロードできませんでした "。詳細は下記(Eclipse開発モードコンソール)を参照してください。

[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 

(コンテンツはHibernateバリからのコピー&ペーストである)の公開クラスGwtConstraintViolationはConstraintViolation、IsSerializableが実装」としてGwtConstraintViolationが定義されています。私はGWTがそれを好まないことを知っているので、私はObjectフィールドをコメントアウトしました。

+0

ConstraintViolationExceptionの実装を独自のコンストラクタに追加しようとしましたか? – Bob

+0

私は例外を一切取り除き、ConstraintViolationのSetを返します(これは同じですが、ConstraintViolationExceptionはラッパークラス以外のものです)。うん、GwtConstraintViolationにはパラメータのないコンストラクタがある。 – Toto

+0

GWTのCustomSerializer for ConstraintViolationImplはかなりの量の情報を捨ててしまいます(https://github.com/vaadin/gwt/blob/master/user/src/org/hibernate/validator/engine/ConstraintViolationImpl_CustomFieldSerializer.javaを参照)。これらのフィールドのいくつかは、エディタ/ドライバで生成されたコードがエラーメッセージを正しく表示するために必要なものがあるようです(同じ制約のクライアント側を検証してみましたが、クライアントの場合はクライアントサイズです。 ConstraintViolationオブジェクト:動作しませんでした)。私は、私が仕事をすることができない分野を見なければならないでしょう。 – Toto

答えて

0

いいえ、GWT documentationによれば、RPCメソッドから例外をスローすることができます。それは彼らが

  • 未チェックの例外はInvocationExceptionにラップされているメソッドのシグネチャでthrowsとして記載されているのに十分だ

    • チェック例外のために:

      正確なハンドリングは、例外の種類に依存します。元の例外はサーバー側に記録されます。

    あなたのケースでは、ConstraintViolationExceptionは未チェックの例外です。これは、クライアント側でInvocationExceptionとして "キャッチ可能"である必要があります。あなたが掲示したstacktraceは、サーバー側のログ出力でなければなりません。

    クライアント側でチェックされていない例外をさらに処理したい場合は、それを独自のチェック例外にラップし、RPCメソッドからスローすることをお勧めします。

  • +0

    これはすべて本当です(私はこれを知っています)が、これは私の質問についてです。私がしたいのは、現在のonFailure/onSuccessロジックを乱さずに、ConstraintViolation、ConstraintViolationException、またはRPCメソッドのシグネチャで同等のfunctionnalityを持つ他の型を持つことだけです。私はGWT RPCメソッドがGWTが戻り値として拒否する型を投げてもいいという印象を受けていますか? (私にとっては驚くべきことですが、これは非常に直感的です)。そして、私は例外を使用するように私のコードを更新しようとしています。なぜなら、私には選択肢がありません(まもなくアップデートが追加されます)。 – Toto

    +0

    メソッドの 'throws'-PartにConstraintViolationExceptionのリストを表示しようとしましたか? – Bob

    +0

    それは私に同じエラーを与えます:((そして、期待されるConstraintViolationExceptionの代わりにStatusCodeExceptionクライアント側を取得します)GWTの公式の例でさえも取得できません(http://www.gwtproject.org/doc/latest/を参照)。 DevGuideValidation.html)そのように動作します! – Toto

    関連する問題