• springmvc配置MappingJackson2HttpMessageConverter实现属性驼峰和下划线的转换


    需求

      php调用java接口时,因为php那边的属性都是下划线风格,java这边的属性都是驼峰的风格。配置springmvc的json转换,在requestBody的时候(调用对象的set 方法)将java属性name映射成下划线形式 和 请求的参数匹配;在responseBody的时候(调用对象的get方法)将java的属性name也映射成下划线形式。

    MappingJackson2HttpMessageConverter配置

    <mvc:annotation-driven>
            <mvc:message-converters>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="objectMapper">
                        <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                            <!-- 处理responseBody 里面日期类型 -->
                            <!--   <property name="dateFormat">
                                  <bean class="java.text.SimpleDateFormat">
                                      <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />
                                  </bean>
                              </property>  -->
                            <!-- 为null字段时不显示 -->
                            <property name="serializationInclusion">
                                <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
                            </property>
                            <property name="propertyNamingStrategy">
                                <!--<bean class="com.xxx.serializer.MyPropertyNamingStrategyBase" />-->
                                <bean class="com.fasterxml.jackson.databind.PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy" />
                            </property>
                        </bean>
                    </property>
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html;charset=UTF-8</value>
                            <value>application/json; charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>

     自定义PropertyNamingStrategy

    import com.fasterxml.jackson.databind.PropertyNamingStrategy;
    import com.fasterxml.jackson.databind.cfg.MapperConfig;
    import com.fasterxml.jackson.databind.introspect.AnnotatedField;
    import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
    import com.fasterxml.jackson.databind.introspect.AnnotatedParameter;
    import org.apache.commons.lang3.StringUtils;
    
    /**
     * Created by hujunzheng on 2017/6/7.
     */
    public class MyPropertyNamingStrategyBase extends PropertyNamingStrategy {
    
        @Override
        public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) {
            return defaultName;
        }
    
        @Override
        public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
            return underscoreName(defaultName);
        }
    
        @Override
        public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
            return underscoreName(defaultName);
        }
    
        @Override
        public String nameForConstructorParameter(MapperConfig<?> config, AnnotatedParameter ctorParam,
                                                  String defaultName) {
            return defaultName;
        }
    
        private String underscoreName(String name) {
            if (StringUtils.isEmpty(name)) {
                return "";
            }
            StringBuilder result = new StringBuilder();
            result.append(name.substring(0, 1).toLowerCase());
            for (int i = 1; i < name.length(); ++i) {
                String s = name.substring(i, i + 1);
                String slc = s.toLowerCase();
                if (!(s.equals(slc))) {
                    result.append("_").append(slc);
                } else {
                    result.append(s);
                }
            }
            return result.toString();
        }
    
        private String withoutUnderscoreName(String name) {
            if (StringUtils.isEmpty(name)) {
                return "";
            }
            StringBuilder result = new StringBuilder();
            result.append(name.substring(0, 1).toLowerCase());
            boolean underscore = false;
            for (int i = 1; i < name.length(); ++i) {
                String s = name.substring(i, i + 1);
                if ("_".equals(s)) {
                    underscore = true;
                    continue;
                } else {
                    if (underscore) s = s.toUpperCase();
                    underscore = false;
                }
                result.append(s);
            }
            return result.toString();
        }
    }
  • 相关阅读:
    【掉下巴】枪的制造现场
    不引入第三个变量交换两个变量的方法
    [转]科学计算经典算法
    [小练eVC]常用控件之微调按钮
    【收购】LSI 40亿美元并购Agere
    VB6.0不支持鼠标滚轮的解决办法
    一个简单的BP网络C语言程序
    [转]想成为嵌入式程序员应知道的0x10个基本问题
    [zt]关于左值"lvalue"和右值"rvalue"的一点理解
    [掉下巴]细数非洲大山的肘下亡魂
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/6959182.html
Copyright © 2020-2023  润新知