Open dudan57 opened 7 years ago
public class Issue1368 extends TestCase { public void test_for_issue() throws Exception { ExtendedServletRequestDataBinder binder = new ExtendedServletRequestDataBinder(new Object()); String json = JSON.toJSONString(binder); System.out.println(json); Assert.assertTrue(json.indexOf("$ref")>=0); } }
{"autoGrowCollectionLimit":256,"autoGrowNestedPaths":true,"bindEmptyMultipartFiles":true,"bindingErrorProcessor":{},"bindingResult":{"allErrors":[],"errorCount":0,"fieldErrorCount":0,"fieldErrors":[],"globalErrorCount":0,"globalErrors":[],"messageCodesResolver":{},"model":{"target":{},"org.springframework.validation.BindingResult.target":{"$ref":".."}},"nestedPath":"","objectName":"target","propertyAccessor":{"autoGrowCollectionLimit":256,"autoGrowNestedPaths":true,"extractOldValueForEditor":true,"nestedPath":"","propertyDescriptors":[{"beanClass":"java.lang.Object","bound":false,"constrained":false,"displayName":"class","expert":false,"hidden":false,"name":"class","preferred":false,"propertyType":"java.lang.Class","readMethod":{"accessible":false,"annotatedExceptionTypes":[],"annotatedParameterTypes":[],"annotatedReceiverType":{"annotations":[],"declaredAnnotations":[],"type":"java.lang.Object"},"annotatedReturnType":{"annotatedActualTypeArguments":[{"annotatedLowerBounds":[],"annotatedUpperBounds":[{"annotations":[],"declaredAnnotations":[],"type":"java.lang.Object"}],"annotations":[],"declaredAnnotations":[],"type":{"lowerBounds":[],"typeName":"?","upperBounds":["java.lang.Object"]}}],"annotations":[],"declaredAnnotations":[],"type":{"actualTypeArguments":[{"$ref":"$.bindingResult.propertyAccessor.propertyDescriptors[0].readMethod.annotatedReturnType.annotatedActualTypeArguments[0].type"}],"rawType":"java.lang.Class","typeName":"java.lang.Class<?>"}},"annotations":[],"bridge":false,"declaringClass":"java.lang.Object","default":false,"exceptionTypes":[],"genericExceptionTypes":[],"genericParameterTypes":[],"genericReturnType":{"$ref":"$.bindingResult.propertyAccessor.propertyDescriptors[0].readMethod.annotatedReturnType.type"},"modifiers":273,"name":"getClass","parameterAnnotations":[],"parameterCount":0,"parameterTypes":[],"returnType":"java.lang.Class","synthetic":false,"typeParameters":[],"varArgs":false},"shortDescription":"class"}],"rootClass":"java.lang.Object","rootInstance":{"$ref":"$.bindingResult.model.target"},"wrappedClass":"java.lang.Object","wrappedInstance":{"$ref":"$.bindingResult.model.target"}},"propertyEditorRegistry":{"$ref":"$.bindingResult.propertyAccessor"},"suppressedFields":[],"target":{"$ref":"$.bindingResult.model.target"}},"fieldDefaultPrefix":"!","fieldMarkerPrefix":"_","ignoreInvalidFields":false,"ignoreUnknownFields":true,"objectName":"target","target":{"$ref":"$.bindingResult.model.target"},"validators":[]}
未发现此问题。
在这里用JSON.toJSONString(binder);的确没问题了,但用JSON.toJSON(binder);会导致死循环?
com.alibaba.fastjson.JSONException: write javaBean error, class org.springframework.web.servlet.mvc.method.annotation.ExtendedServletRequestDataBinder, fieldName : 0, write javaBean error, class org.springframework.validation.BeanPropertyBindingResult, fieldName : bindingResult
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:364)
at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:111)
at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:307)
at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:285)
at com.alibaba.fastjson.serializer.ObjectArrayCodec.write(ObjectArrayCodec.java:118)
at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:278)
at com.alibaba.fastjson.JSON.toJSONString(JSON.java:652)
at com.alibaba.fastjson.JSON.toJSONString(JSON.java:594)
at com.alibaba.fastjson.JSON.toJSONString(JSON.java:559)
at com.test.config.ControllerLogInterceptor.methodBefore(ControllerLogInterceptor.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:611)
at org.springframework.aop.aspectj.AspectJMethodBeforeAdvice.before(AspectJMethodBeforeAdvice.java:43)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:51)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
at com.test.account.controller.FundAccountManageController$$EnhancerBySpringCGLIB$$ffd09760.init(
toJSON没有做循环检测,先使用toJSONString吧
当一个对象的get方法中new了一个对象时,使用fastjson转成json串,会报循环引用异常,但用Gson转成json串,就没问题,fastjson可以解决这个问题吗?(org.springframework.web.servlet.mvc.method.annotation.ExtendedServletRequestDataBinder,这个类用fastjson打印就会报循环引用异常)