SpringBoot 프로젝트 는 인터페이스 매개 변수의 공백 값 을 null 값 으로 바 꾸 는 방법(추천)
8200 단어 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 값 으로 바 꾸 는 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.