alibaba / fastjson

FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
https://github.com/alibaba/fastjson2/wiki/fastjson_1_upgrade_cn
Apache License 2.0
25.74k stars 6.5k forks source link

V1.2.44 @JSONField的format时间格式化配置会被全局配置覆盖 #1696

Open cranone opened 6 years ago

cranone commented 6 years ago

@JSONField的format时间格式化配置会被全局配置覆盖

@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date date;

xml中

    <mvc:annotation-driven conversion-service="conversionService">
        <mvc:message-converters register-defaults="true">        
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes" value="application/json;charset=UTF-8" />
                <property name="fastJsonConfig">
                    <bean
                        class="com.alibaba.fastjson.support.config.FastJsonConfig">
                        <property name="serializerFeatures">
                            <array>
                                <value>WriteMapNullValue</value>
                                <value>WriteDateUseDateFormat</value>
                                <value>DisableCircularReferenceDetect
                                </value>
                                <value>IgnoreNonFieldGetter</value>
                            </array>
                        </property>
                        <property name="dateFormat" value="yyyy-MM-dd" /><!--会覆盖@JSONField的format yyyy-MM-dd HH:mm:ss-->
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

跟踪源码发现在转换javabean的时候FieldSerializer会调用到JSONSerializer的writeWithFormat 在com.alibaba.fastjson.serializer.JSONSerializer中

   public final void writeWithFormat(Object object, String format) {
        if (object instanceof Date) {
            DateFormat dateFormat = this.getDateFormat();
            if (dateFormat == null) {
                dateFormat = new SimpleDateFormat(format, locale);
                dateFormat.setTimeZone(timeZone);
            }
            String text = dateFormat.format((Date) object);
            out.writeString(text);
            return;
        }

全局配置覆盖了传入的format,使@JSONField配置无效 请问本身就是这样设计的还是有bug

kimmking commented 6 years ago

你说的很对,这个属于遗留问题。 但是如果改成以jsonfield为准,对之前的代码有影响。

jqncc commented 6 years ago

同样问题,至今没解决.还有标准注解@Transient也不生效

xkcoding commented 6 years ago

不知这个遗留问题何时可以解决?能否设计成默认选取全局配置,当配置@JSONField 的时候,用@JSONField配置项? @kimmking

chenlang888881 commented 6 years ago

和Springmvc混用时 jsonfield 会被全局覆盖怎么办呢 是不是bug @kimmking

Wadeqin commented 5 years ago

最后的结论是什么?同问

zhuangjiaju commented 5 years ago

@wenshao 温总 这个能不能搞定一下啊。这个真的 很坑