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 필드를 주석 처리했습니다.
ConstraintViolationException 구현 자체를 기본 생성자로 추가 했습니까? – Bob
나는 예외를 모두 삭제했으며 ConstraintViolation의 집합을 반환했다 (이것은 ConstraintViolationException이 래퍼 클래스 이외의 것임). 네, GwtConstraintViolation에는 매개 변수없는 생성자가 있습니다. – Toto
GWT의 CustomSerializer for ConstraintViolationImpl은 상당한 양의 정보를 삭제합니다 (https://github.com/vaadin/gwt/blob/master/user/src/org/hibernate/validator/engine/ConstraintViolationImpl_CustomFieldSerializer.java 참조). 그것은 이러한 필드 중 일부는 내 편집기/드라이버 생성 된 코드를 올바르게 오류 메시지를 표시하는 데 필요한 것 같다 (나는 같은 제약 조건 클라이언트 쪽 유효성 검사를 테스트 한, 그들은 작동합니다. 그런 다음, 클라이언트 크기, 불완전한 "가짜"불완전한 ConstrainViolation 빌드 완료 ConstraintViolation 객체 : 작동하지 않음). 나는 어떤 분야에서 내가없이 일할 수 있는지 알아야 할 것이다. – Toto