Spring에서 RestController를 이용해서 Json으로 응답을 주고 있는데, 모든 API에 대해서 Null값은 "" 으로 바꿔줘야 했다.
응닶값이 Null이면 제거해 주는 Annotation은 존재하지만 공백으로 바꿔주는 Annotation은 존재하지 않는다.
@JsonInclude(Include.NON_NULL) -> Null을 제거해 주는 Annotation
그래서 몇가지 Custom을 통해서 해결이 가능하다.
JsonSerializer 클래스를 상속받아 serialize method를 override한다.
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
public class NullToEmptyStringSerializer extends JsonSerializer<Object>{
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeString("");
}
}
그리고 ObjectMapper를 Custom한다.
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomObjectMapper extends ObjectMapper {
private static final long serialVersionUID = 1L;
public CustomObjectMapper(){
getSerializerProvider().setNullValueSerializer(new NullToEmptyStringSerializer());
}
}
Springboot를 이용하기 때문에 JavaConfig로 설정 하겠다.
그 이후에 MappingJackson2HttpMessageConverter 클래스에 CustumObjectMapper를 설정해 주면 된다.
@Configuration
public class JsonCustomConfigure {
@Bean
public MappingJackson2HttpMessageConverter converter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
CustomObjectMapper mapper = new CustomObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
converter.setObjectMapper(mapper);
return converter;
}
}