SpringBoot 프로젝트 는 인터페이스 매개 변수의 공백 값 을 null 값 으로 바 꾸 는 방법(추천)

문제 발생
저희 회사 코드 가 생 성 되 었 을 때 조회 목록 은 모두 setEntity()를 사 용 했 습 니 다.조회 작성 방법 은 다음 과 같 습 니 다.

public List<BasReservoirArea> selectList(BasReservoirArea basReservoirArea) {
  QueryWrapper<BasReservoirArea> where = new QueryWrapper<>();
  where.setEntity(basReservoirArea);
  return baseMapper.selectList(where);
}
검색 방법 은 Get 방법:
전단 은 url 에 파 라 메 터 를 추가 하여 전 달 됩 니 다.매개 변수 값 이 비어 있 을 때 setEntity()가 공백 을 걸 러 내지 않 기 때문에 sql 을 실행 할 때""를 매개 변수 로 조회 조건 으로 삼 아 조회 에 문제 가 발생 합 니 다.

그래서 나 는 공백 을 null 로 바 꾸 어 이 문 제 를 해결 하고 싶 었 다.
초기 해결
처음에 자 연 스 럽 게 setEntity 전에 판단 하고 BasReservoir Area 라 는 인 스 턴 스 가 필드 의 값 이 공백 이면 null 로 설정 합 니 다.

//1.   map
Map<Object, Object> map = MapUtil.beanToMap(test);
//2.    
MapUtil.removeNullValue(map);
//3.map    
Test entity = JSON.parseObject(JSON.toJSONString(map), Test.class);
사용 하 는 도구 종 류 는 다음 과 같다.

/**
*         map  
*/
public static <T> Map<Object, Object> beanToMap(T bean) {
 Map<Object, Object> map = new HashMap<>();
 if (bean != null) {
 BeanMap beanMap = BeanMap.create(bean);
 for (Object key : beanMap.keySet()) {
  map.put(key, beanMap.get(key));
 }
 }
 return map;
}
/**
*   map  value  
*
* @param map
* @return
*/
public static void removeNullValue(Map map) {
 Set set = map.keySet();
 for (Iterator iterator = set.iterator(); iterator.hasNext(); ) {
 Object obj = (Object) iterator.next();
 Object value = (Object) map.get(obj);
 remove(value, iterator);
 }
}
문제 가 해결 되 었 다.
최적화 하 다.
위의 해결 방안 이 전문 적 이지 않 고 우아 하지 않 은 것 같 기 때문에 더 좋 은 해결 방법 을 찾 아 보 세 요.백 엔 드 에서 매개 변수 값 을 받 을 때 공백 을 받 으 면 null 로 직접 설정 하면 다시 전환 할 필요 가 없습니다.
문 제 를 해결 하려 면 먼저 두 가지 상황 을 고려 해 야 한다.하 나 는 전단 이 Get 요청 을 통 해 경로 에 파 라 메 터 를 가 진 것 이다.다른 하 나 는 Post 요청 입 니 다.Request 메 시 지 를 가지 고 있 습 니 다.
포스트 요청 문체
필 자 는 Post 에서 신문 문체 의 전환 을 잘 알 기 때문에 MappingJackson 2HttpMessage Converter 가 Jackson 과 결합 하여 신문 문체 전환 을 사례 로 하 는 것 을 알 고 있 으 며 Jackson 도 연구 한 적 이 있 기 때문에 해결 방법 은 다음 과 같다.
String.class 의 Jackson 에 대한 반 시퀀스 클래스 를 만 듭 니 다:

public class StringDescrializer extends JsonDeserializer<String> {
  @Override
  public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
    String value = jsonParser.getValueAsString();
    if (value == null || "".equals(value.trim())) {
      return null;
    }
    return value;
  }
}
MappingJackson 2HttpMessage Converter Bean 만 들 기:

@Bean
@Primary
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
 MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
 //    JSON   
 ObjectMapper objectMapper = new ObjectMapper();
 objectMapper.getSerializerProvider().setNullValueSerializer(
 new JsonSerializer<Object>() {
  @Override
  public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider    serializerProvider) throws IOException {
   jsonGenerator.writeString("");
  }
 }
 );
 
 SimpleModule simpleModule = new SimpleModule();
 simpleModule.addDeserializer(String.class, new StringDescrializer());
  //      StringDescrializer
  //registerModules        Module
 objectMapper.registerModule(simpleModule);

  //             
  objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

  jsonConverter.setObjectMapper(objectMapper);
  List<MediaType> list = new ArrayList<>();
  list.add(MediaType.APPLICATION_JSON_UTF8);
  jsonConverter.setSupportedMediaTypes(list);
  return jsonConverter;
}
포스트 문체 로 는 테스트 에 성공 했다.
Get 경로 대역 변수
위의 해결 방법 은 Get 방법 경로 에 파 라 메 터 를 가 진 상황 에 적용 되 지 않 기 때문에 다른 방법 이 필요 합 니 다.
@InitBinder 주 해 를 사 용 했 기 때문에 사용자 정의 Property Editor 를 주입 할 수 있 음 을 알 고 있 습 니 다.Editor 에서 형식 을 사용자 정의 하거나 값 을 되 돌 릴 수 있 음 을 알 고 있 습 니 다.그래서 StringEditor 를 사용자 정의 하여 빈 문 제 를 처리 합 니 다.

public class StringEditor extends PropertyEditorSupport {
  //setAsText               ,
  @Override
  public void setAsText(String text) throws IllegalArgumentException {
    if (text == null || "".equals(text.trim())) {
      text = null;
    }
    setValue(text);
  }

  //getAsText               。
  @Override
  public String getAsText() {
    if (getValue() != null) {
      return getValue().toString();
    }
    return null;
  }
}
전역 controller 에서 이 Databinder 를 공유 하려 면:

@ControllerAdvice
public class GlobalControllerAdiviceController {
  //WebDataBinder                  ,    WebBindingInitializer
  //       controller   dataBiner 
  @InitBinder
  public void dataBind(WebDataBinder binder) {
    ///o             
    binder.registerCustomEditor(String.class, new StringEditor());
  }
}
Get 경로 대 파라미터 에 대한 테스트 도 성 공 했 습 니 다.
사고 하 다.
문 제 를 해결 한 후에 도 우아 하지 않다 고 생각 했 습 니 다.spring 은 이런 상황 을 고려 할 것 이 라 고 생각 했 습 니 다.마침내 spring 문서 에서 StringTrimmer Editor()를 찾 아 보 았 습 니 다.https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-beans)"Get"방법 을 실현 할 때 매개 변 수 는 빈 칸 을 제거 합 니 다:

다만 이 editor 는 등록 이 부족 하여 손 으로 등록 해 야 합 니 다.

@ControllerAdvice
public class GlobalControllerAdiviceController {
  //WebDataBinder                  ,    WebBindingInitializer
  //       controller   dataBiner Java  
  @InitBinder
  public void dataBind(WebDataBinder binder) {
    ///  
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
  }
}
StringTrimmer Editor 구조 방법 에 인자 가 있 습 니 다.true 에 들 어 오 면 공백 을 null 로 변환 합 니 다.이렇게 앞 에 쓴 StringEditor 는 사용 하지 않 습 니 다.spring 은 이미 작성 해 주 었 습 니 다.
'Post'신문 의 문체 에 있어 서 사실은 제 가 바 꿔 야 할 것 은'Jackson Object Mapper'입 니 다.전체 Mapping Jackson 2HttpMessage Converter 를 사용자 정의 할 필요 가 없습니다.Jackson Object Mapper 를 사용자 정의 해 야 합 니 다.바 이 두 를 해 보 니 역시 친구 들 이 해결 방안 을 가지 고 있 습 니 다.

@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
  return new Jackson2ObjectMapperBuilderCustomizer() {
    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
      jacksonObjectMapperBuilder
          .deserializerByType(String.class, new StdScalarDeserializer<String>(String.class) {
            @Override
            public String deserialize(JsonParser jsonParser, DeserializationContext ctx)
                throws IOException {
              //      :        null
              String value = jsonParser.getValueAsString();
              if (value == null || "".equals(value.trim())) {
                return null;
              }
              return value;
            }
          });
    }
  };
}
위의 사용자 정의 String Descrializer 와 Mapping Jackson 2HttpMessage Converter 를 제거 하고 위의 것 만 유지 하면 됩 니 다.
후기
많은 문제 가 있 습 니 다.사실 spring 은 해결 방안 을 제 공 했 지만 spring 시스템 은 현재 너무 커서 많은 API 와 기능 이 알려 지지 않 았 습 니 다.그래서 문제 에 부 딪 히 면 기록 하 는 게 좋 은 습관 이에 요.
SpringBoot 프로젝트 가 인터페이스 매개 변수 에 있 는 공백 값 을 null 값 으로 우아 하 게 바 꾸 는 방법 에 대한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 SpringBoot 공백 값 을 null 값 으로 바 꾸 는 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기