BigDecimal 자릿수 검사를 doSetValue() 시점으로 이동
- doSetValue()의 TYPE_BIGDECIMAL case에 isValid() 검사 추가 - 자릿수 초과 오류 발생 시점이 getData()에서 setData()로 통일 - 테스트: 자릿수 초과 3건 기대 예외를 InvalidDataTypeException → MessageSetDataException으로 변경 - JSON_VALIDATION_TEST_PLAN.md 내용 최신화 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -265,6 +265,12 @@ public class JSONMessage extends Message {
|
||||
setLong( itemPath, new Long(value) );
|
||||
break;
|
||||
case Types.TYPE_BIGDECIMAL :
|
||||
if (SystemKeys.isValidationEnabled() && !isValid(value, item.getLength(), item.getDecimalPointLength())) {
|
||||
throw new InvalidAccessException(
|
||||
String.format("Invalid decimal point format Error value=%s,length=%d,pointLength=%d",
|
||||
value, item.getLength(), item.getDecimalPointLength()),
|
||||
itemPath);
|
||||
}
|
||||
setBigDecimal( itemPath, new BigDecimal(value) );
|
||||
break;
|
||||
case Types.TYPE_DOUBLE :
|
||||
|
||||
@@ -16,7 +16,6 @@ import org.springframework.test.context.jdbc.Sql;
|
||||
|
||||
import com.eactive.eai.transformer.engine.TransformEngine;
|
||||
import com.eactive.eai.transformer.function.jpa.TransformJPATestConfiguration;
|
||||
import com.eactive.eai.transformer.message.InvalidDataTypeException;
|
||||
import com.eactive.eai.transformer.message.Message;
|
||||
import com.eactive.eai.transformer.message.MessageFactory;
|
||||
import com.eactive.eai.transformer.message.MessageSetDataException;
|
||||
@@ -32,7 +31,7 @@ import com.eactive.eai.transformer.message.MessageSetDataException;
|
||||
*
|
||||
* 검증 시나리오
|
||||
* 1) 타입 불일치 — 숫자형 필드에 비숫자 문자열 입력 시 setData() 에서 즉시 오류
|
||||
* 2) 길이 초과 — BigDecimal 정수부/소수부 자릿수 초과 시 getData() 에서 오류
|
||||
* 2) 길이 초과 — BigDecimal 정수부/소수부 자릿수 초과 시 setData() 에서 즉시 오류
|
||||
* (SystemKeys.TRANSFROMER_VALIDATION=true 필요)
|
||||
*/
|
||||
@DataJpaTest
|
||||
@@ -111,59 +110,56 @@ class JSONMessageValidationTest {
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
// 2. 숫자형 길이 초과 테스트 — getData() 시점에 오류 발생
|
||||
// 2. 숫자형 길이 초과 테스트 — setData() 시점에 오류 발생
|
||||
// transformer.validation=true 설정 필요
|
||||
// ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Test
|
||||
@DisplayName("BIG_VALUE 정수부 초과(5자리 > 4자리 제한) → InvalidDataTypeException")
|
||||
void testBigDecimalIntegerPartOverflow() throws Exception {
|
||||
@DisplayName("BIG_VALUE 정수부 초과(5자리 > 4자리 제한) → MessageSetDataException")
|
||||
void testBigDecimalIntegerPartOverflow() {
|
||||
enableValidation();
|
||||
|
||||
// 정수부 5자리(12345) → 제한(4자리) 초과
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG_VALUE\":12345.12345}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
msg.setData(data);
|
||||
|
||||
InvalidDataTypeException ex = assertThrows(
|
||||
InvalidDataTypeException.class,
|
||||
() -> msg.getData()
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsMessage(ex, "Invalid decimal point format"),
|
||||
"'Invalid decimal point format' 메시지가 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BIG_VALUE 소수부 초과(6자리 > 5자리 제한) → InvalidDataTypeException")
|
||||
void testBigDecimalFractionalPartOverflow() throws Exception {
|
||||
@DisplayName("BIG_VALUE 소수부 초과(6자리 > 5자리 제한) → MessageSetDataException")
|
||||
void testBigDecimalFractionalPartOverflow() {
|
||||
enableValidation();
|
||||
|
||||
// 소수부 6자리(123456) → 제한(5자리) 초과
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG_VALUE\":1234.123456}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
msg.setData(data);
|
||||
|
||||
InvalidDataTypeException ex = assertThrows(
|
||||
InvalidDataTypeException.class,
|
||||
() -> msg.getData()
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsMessage(ex, "Invalid decimal point format"),
|
||||
"'Invalid decimal point format' 메시지가 포함되어야 합니다");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("BIG15_VALUE 정수부 초과(16자리 > 15자리 제한) → InvalidDataTypeException")
|
||||
void testBigDecimalIntegerOnlyOverflow() throws Exception {
|
||||
@DisplayName("BIG15_VALUE 정수부 초과(16자리 > 15자리 제한) → MessageSetDataException")
|
||||
void testBigDecimalIntegerOnlyOverflow() {
|
||||
enableValidation();
|
||||
|
||||
// 정수부 16자리 → 제한(15자리) 초과
|
||||
String data = "{\"EAI_UJSONTYPE_REQ1\":{\"BIG15_VALUE\":1234567890123456}}";
|
||||
Message msg = MessageFactory.getFactory().getMessage("EAI_UJSONTYPE_REQ1");
|
||||
msg.setData(data);
|
||||
|
||||
InvalidDataTypeException ex = assertThrows(
|
||||
InvalidDataTypeException.class,
|
||||
() -> msg.getData()
|
||||
MessageSetDataException ex = assertThrows(
|
||||
MessageSetDataException.class,
|
||||
() -> msg.setData(data)
|
||||
);
|
||||
assertTrue(containsMessage(ex, "Invalid decimal point format"),
|
||||
"'Invalid decimal point format' 메시지가 포함되어야 합니다");
|
||||
|
||||
Reference in New Issue
Block a user