Springbootはフロントエンドオブジェクトnullを返して空の文字列に変換する

3635 ワード

モバイル端末のインタフェースをテストするとき、携帯電話端末の開発者は私たちに返却対象nullを空の文字列に変えて、ページがnullを表示するのが美しくないと思っています.私は彼らに携帯電話で判断させておけばよかったが、彼らはとても不本意な様子で、実際には怠け者だった.もういい、インターネットで資料を探しました.
import java.io.IOException;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
/**
 * null 
 * @author  
 *
 */
@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        SerializerProvider serializerProvider = objectMapper.getSerializerProvider();
        serializerProvider.setNullValueSerializer(new JsonSerializer() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
            		jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

その後、nullオブジェクトはすべて空の文字列に変わります.
しかし、携帯電話側はまた嫌がって、配列とオブジェクトは空の文字列を返さないで、[]と{}を返すか、nullを返すかと言っています.
この方法がこんなに横暴で、どう考えても適切ではないのか、この方法に基づいて元のオブジェクトのタイプを判断し、Stringだけが空の文字列を返すと思いますが、残念ながらこの方法は非常に不完全で、オブジェクトのタイプを判断することができません.null値はnull値です.私は別の方法を探すしかなかった.探してみると、適当なコードが見つかりました.
import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;

@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter{
    @Override
    public void configureMessageConverters(List> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        converter.setFeatures(SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullStringAsEmpty,// null 
                SerializerFeature.WriteNullBooleanAsFalse,
                SerializerFeature.PrettyFormat);
        converters.add(converter);
   }
}

この方法は適切で,null文字列を空文字列に的確に変換できるだけでなく,他にも多くの機能があり,詳細はSerializerFeatureを参照する.
そして、私が大功を成し遂げたと思ったとき、携帯電話側の開発はまたタイムスタンプと戻りパラメータの頭文字の大文字が失効したことを教えてくれました(携帯電話側のインタフェースは極めて規範的ではなく、パラメータは頭文字で書くべきです).これは@JsonFormatと@JsonProperty注釈に対応しています.この2つの注釈はcomに属していることをよく見てください.fasterxml.ジャックソン、そして
WebMvcConfigurerAdapterはcomに属する.alibaba.fastjsonの.これは私をとても憂鬱にさせて、この2つはすべて失効して、それでは私は変換器を使うことができないのではありませんか.モバイル側のニーズを満たすことができないか、lowの判断文字列がnullを「」に変えるしかないか、代替品を見つけてよかった.@JSOnField.
@JSOnField(format="yyyy-MM-dd H:mm:ss")は@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")の代わりに使用できます.
@JSOnField(name="T 3")は@JsonProperty(value="T 3")の代わりに使用できます.
念のため、私は2つの注釈を全部書いて、後でいつでもシステムを変えることができます.
完了