2017-04-12 1 views
1

비슷한 질문이있는 것 같지만 대답을 찾지 못하는 것 같습니다.Deserialise Json 중첩 된 pojo의

컨트롤러의 jqGrid 필터 속성에서 반환 된 json을 구문 분석하려고합니다. 그것을 작동 시키려면, 나는 일단 cloney로 작업하고 나면 다음 단계를 밟아서 RequestBody로 전달하고 Spring에서이 중 일부를 처리하도록한다. 지금은 가능하면이 방법으로 작업하고 싶습니다. 그것은 단지 어쩌면 내가 어리석은 실수를 저질렀을지도 모르는 것처럼 보인다.

내가 시도하고 JSON 문자열은 String 매개 변수에 필터라고하며이 매우 기본적인 코드가

@SuppressWarnings("unused") 
private class Filter { 

    private String groupOp; 
    private List<Rule> rules; 

    public String getGroupOp() { 
     return groupOp; 
    } 
    public void setGroupOp(String groupOp) { 
     this.groupOp = groupOp; 
    } 

    public List<Rule> getRules() { 
     return rules; 
    } 
    public void setRules(List<Rule> rules) { 
     this.rules = rules; 
    } 

} 

private class Rule { 

     private String field; 
     private String op; 
     private String data; 

     public String getField() { 
      return field; 
     } 
     public void setField(String field) { 
      this.field = field; 
     } 

     public String getOp() { 
      return op; 
     } 
     public void setOp(String op) { 
      this.field = op; 
     } 

     public String getData() { 
      return data; 
     } 
     public void setData(String data) { 
      this.data = data; 
     } 
} 

데이터를 deserialise하는이 빠른 POJO를을했습니다

{"groupOp":"AND","rules":[{"field":"accountName","op":"cn","data":"E"},{"field":"accountRef","op":"cn","data":"E"}]} 

JSON 샘플 그것을 deserialise하는 것

byte[] jsonData = filter.getBytes(); 

ObjectMapper objectMapper = new ObjectMapper();   
Filter f = objectMapper.readValue(jsonData, Filter.class); 

나의 샘플을 읽는 것은 이것이 매우 기본적이고 나쁘다는 것이다. itten하지만 일을해야합니다. 대신 오류가 발생합니다 ...

여기에 전체 오류가 배수 될 수 있습니까? 아무도 내가 잘못 가고 있다고 말할 수 있습니까?

com.fasterxml.jackson.databind.JsonMappingException: Can not construct 
instance of com.app.AppController$Filter: no String-argument constructor/factory method to deserialize from String value (' {"groupOp":"AND","rules":[{"field":"accountName","op":"cn","data":"E"},{"field":"accountRef","op":"cn","data":"E"}]}') 
at [Source: [[email protected]; line: 1, column: 1] 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1012) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:370) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:315) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1290) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:159) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:150) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3798) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2929) ~[jackson-databind-2.8.7.jar:2.8.7] 
    at com.app.AppController.downloadAccounts(AppController.java:580) ~[classes/:na] 
    at com.app.AppController$$FastClassBySpringCGLIB$$6a077f1a.invoke(<generated>) ~[classes/:na] 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) ~[spring-aop-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) ~[spring-aop-5.0.0.M3.jar:5.0.0.M3] 
    at com.app.AppControllerController$$EnhancerBySpringCGLIB$$8ff0ac7a.downloaAccounts(<generated>) ~[classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_101] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_101] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_101] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_101] 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:220) ~[spring-web-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) ~[spring-web-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) ~[spring-webmvc-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:964) [spring-webmvc-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:856) [spring-webmvc-5.0.0.M3.jar:5.0.0.M3] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:841) [spring-webmvc-5.0.0.M3.jar:5.0.0.M3] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-5.0.0.M3.jar:5.0.0.M3] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.0.M3.jar:5.0.0.M3] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) [tomcat-embed-core-7.0.47.jar:7.0.47] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_101] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_101] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_101] 

답변

1

나는 FilterRule 모두 개인 내부 클래스입니다 것을 알 수있다. 그렇기 때문에 Jackson은 자신의 인스턴스를 만들 수 없습니다. 공개 중첩 클래스로 만들자. 즉, 클래스를 public static 클래스로 선언하거나 소스 파일을 별도로 이동하십시오.

또한 stacktrace에서 바이트 배열에 시작 부분에 작은 따옴표가 있고 끝 부분에 작은 따옴표가 포함되어 있음을 알았습니다. 그들을 제거해야합니다, 첫 번째 문자는 여는 중괄호이고 마지막 하나는 닫는 중괄호 여야합니다. 그렇지 않으면 readValue은 문자열 인 것처럼 처리합니다.

+0

고마워요. 시도했지만 동일한 오류가 발생합니다. – gringogordo

+0

@gringogordo 나는 내 대답을 –

+0

업데이트했습니다. 죄송합니다. 무슨 뜻인지 알기 때문에, 지금은 그것들을 별도의 파일에 넣었습니다. 그래서 그들은 표준 공용 클래스입니다. 내 생각에 ''는 문자열로 표시하는 디버그의 일부일 뿐이라고 생각합니다. System.out.println을 수행하면 거기에 없습니다. 나는 여전히 같은 오류가 발생하는 것 같습니다. 나는 그것 위에서 자고, 아침에 다시 시험 할 것이다! 도와 주셔서 감사합니다 ! – gringogordo