2016-11-10 15 views
0

RPC (GWT 2.5)와 함께 내 비동기 콜백 반환 값에 ConstraintViolation 또는 ConstraintViolationException 객체를 사용할 수 있습니까?GWT 서버 측 유효성 검사 및 RPC 직렬화

나는 ConstraintViolation에 매개 변수없는 생성자가 없기 때문에 처음에는 ConstraintViolation을 시도했지만 GWT에서는이를 원하지 않았다.

그런 다음 ConstraintViolationException을 시도했지만 다른 이유로 인해 작동하지 않습니다 (아래 추적 참조).

리턴 값을 사용하는 대신 예외 (catch)가 반드시 발생합니까?

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.mycompany.common.gwt.ui.shared.GwtConstraintViolation '유형이이 항목에 의해 직렬화 될 수있는 유형에 포함되지 않았기 때문에"com.google.gwt.user.client.rpc.SerializationException : 유형 "이 작동하지 않습니다. 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 

GwtConstraintViolation는 다음과 같이 정의된다 (콘텐츠가 최대 절전 모드 검사기에서 복사 - 붙여 넣기입니다) '공용 클래스 GwtConstraintViolation는 ConstraintViolation, IsSerializable는 구현'. GWT가 그런 것을 좋아하지 않기 때문에 Object 필드를 주석 처리했습니다.

+0

ConstraintViolationException 구현 자체를 기본 생성자로 추가 했습니까? – Bob

+0

나는 예외를 모두 삭제했으며 ConstraintViolation의 집합을 반환했다 (이것은 ConstraintViolationException이 래퍼 클래스 이외의 것임). 네, GwtConstraintViolation에는 매개 변수없는 생성자가 있습니다. – Toto

+0

GWT의 CustomSerializer for ConstraintViolationImpl은 상당한 양의 정보를 삭제합니다 (https://github.com/vaadin/gwt/blob/master/user/src/org/hibernate/validator/engine/ConstraintViolationImpl_CustomFieldSerializer.java 참조). 그것은 이러한 필드 중 일부는 내 편집기/드라이버 생성 된 코드를 올바르게 오류 메시지를 표시하는 데 필요한 것 같다 (나는 같은 제약 조건 클라이언트 쪽 유효성 검사를 테스트 한, 그들은 작동합니다. 그런 다음, 클라이언트 크기, 불완전한 "가짜"불완전한 ConstrainViolation 빌드 완료 ConstraintViolation 객체 : 작동하지 않음). 나는 어떤 분야에서 내가없이 일할 수 있는지 알아야 할 것이다. – Toto

답변

0

아니요, GWT documentation에 따르면 RPC 메서드에서 예외를 throw 할 수 있습니다. 그들은

  • 되지 않은 예외가 InvocationException에 랩하는 방법 서명에 throws로 표시 한 것으로 충분

    • 확인 예외 :

      정확한 처리는 예외의 유형에 따라 달라집니다. 원래 예외는 서버 측에 기록됩니다.

    귀하의 경우에 ConstraintViolationException은 확인되지 않은 예외입니다. 그것은 클라이언트 측에서 InvocationException으로 "catchable"해야합니다. 게시 한 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/ 참고) – Toto