diff --git a/checkstyle.xml b/checkstyle.xml
index cc630396..369704f6 100644
--- a/checkstyle.xml
+++ b/checkstyle.xml
@@ -329,7 +329,6 @@
-
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/codec/DefaultStringDeserializer.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/codec/DefaultStringDeserializer.java
index e43c6302..132d81e8 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/codec/DefaultStringDeserializer.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/codec/DefaultStringDeserializer.java
@@ -1,5 +1,11 @@
package com.tvd12.ezyhttp.core.codec;
+import com.tvd12.ezyfox.collect.Lists;
+import com.tvd12.ezyfox.collect.Sets;
+import com.tvd12.ezyfox.io.EzyDataConverter;
+import com.tvd12.ezyfox.io.EzyDates;
+import com.tvd12.ezyfox.io.EzyStrings;
+
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
@@ -7,21 +13,7 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import com.tvd12.ezyfox.collect.Lists;
-import com.tvd12.ezyfox.collect.Sets;
-import com.tvd12.ezyfox.io.EzyDataConverter;
-import com.tvd12.ezyfox.io.EzyDates;
-import com.tvd12.ezyfox.io.EzyStrings;
+import java.util.*;
public class DefaultStringDeserializer implements StringDeserializer {
@@ -49,7 +41,10 @@ public T deserialize(
}
@SuppressWarnings({"unchecked"})
- public T deserialize(String value, Class outType) throws IOException {
+ public T deserialize(
+ String value,
+ Class outType
+ ) throws IOException {
StringMapper mapper = mappers.get(outType);
if (mapper == null) {
if (value == null) {
@@ -70,6 +65,29 @@ public T deserialize(String value, Class outType) throws IOException {
}
}
+ @SuppressWarnings({"unchecked"})
+ public T deserializeOrNull(
+ String value,
+ Class outType
+ ) {
+ StringMapper mapper = mappers.get(outType);
+ if (mapper == null) {
+ if (value == null) {
+ return null;
+ }
+ if (outType.isEnum()) {
+ return stringToEnum(value, outType);
+ }
+ } else {
+ try {
+ return (T) mapper.apply(value);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+ return null;
+ }
+
@SuppressWarnings({"unchecked", "rawtypes"})
private T stringToEnum(String value, Class outType) {
try {
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpBadRequestException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpBadRequestException.java
index ad683b16..c67fcba3 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpBadRequestException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpBadRequestException.java
@@ -8,4 +8,8 @@ public class HttpBadRequestException extends HttpRequestException {
public HttpBadRequestException(Object data) {
super(StatusCodes.BAD_REQUEST, data);
}
+
+ public HttpBadRequestException(Object data, Throwable cause) {
+ super(StatusCodes.BAD_REQUEST, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpConflictException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpConflictException.java
index 166829eb..a843b415 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpConflictException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpConflictException.java
@@ -8,4 +8,8 @@ public class HttpConflictException extends HttpRequestException {
public HttpConflictException(Object data) {
super(StatusCodes.CONFLICT, data);
}
+
+ public HttpConflictException(Object data, Throwable cause) {
+ super(StatusCodes.CONFLICT, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpForbiddenException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpForbiddenException.java
index 5686148b..3d335fbe 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpForbiddenException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpForbiddenException.java
@@ -8,4 +8,8 @@ public class HttpForbiddenException extends HttpRequestException {
public HttpForbiddenException(Object data) {
super(StatusCodes.FORBIDDEN, data);
}
+
+ public HttpForbiddenException(Object data, Throwable cause) {
+ super(StatusCodes.FORBIDDEN, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpInternalServerErrorException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpInternalServerErrorException.java
index ed47371a..1e88c8e2 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpInternalServerErrorException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpInternalServerErrorException.java
@@ -8,4 +8,8 @@ public class HttpInternalServerErrorException extends HttpRequestException {
public HttpInternalServerErrorException(Object data) {
super(StatusCodes.INTERNAL_SERVER_ERROR, data);
}
+
+ public HttpInternalServerErrorException(Object data, Throwable cause) {
+ super(StatusCodes.INTERNAL_SERVER_ERROR, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpMethodNotAllowedException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpMethodNotAllowedException.java
index 42d3b239..4a804187 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpMethodNotAllowedException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpMethodNotAllowedException.java
@@ -8,4 +8,8 @@ public class HttpMethodNotAllowedException extends HttpRequestException {
public HttpMethodNotAllowedException(Object data) {
super(StatusCodes.METHOD_NOT_ALLOWED, data);
}
+
+ public HttpMethodNotAllowedException(Object data, Throwable cause) {
+ super(StatusCodes.METHOD_NOT_ALLOWED, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpNotAcceptableException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpNotAcceptableException.java
index ed33362a..20a73b02 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpNotAcceptableException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpNotAcceptableException.java
@@ -8,4 +8,8 @@ public class HttpNotAcceptableException extends HttpRequestException {
public HttpNotAcceptableException(Object data) {
super(StatusCodes.NOT_ACCEPTABLE, data);
}
+
+ public HttpNotAcceptableException(Object data, Throwable cause) {
+ super(StatusCodes.NOT_ACCEPTABLE, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpNotFoundException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpNotFoundException.java
index b4bba70c..904eb6c0 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpNotFoundException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpNotFoundException.java
@@ -8,4 +8,8 @@ public class HttpNotFoundException extends HttpRequestException {
public HttpNotFoundException(Object data) {
super(StatusCodes.NOT_FOUND, data);
}
+
+ public HttpNotFoundException(Object data, Throwable cause) {
+ super(StatusCodes.NOT_FOUND, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpPaymentRequiredException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpPaymentRequiredException.java
index 2043d4f5..f21fc1d0 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpPaymentRequiredException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpPaymentRequiredException.java
@@ -8,4 +8,8 @@ public class HttpPaymentRequiredException extends HttpRequestException {
public HttpPaymentRequiredException(Object data) {
super(StatusCodes.PAYMENT_REQUIRED, data);
}
+
+ public HttpPaymentRequiredException(Object data, Throwable cause) {
+ super(StatusCodes.PAYMENT_REQUIRED, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpRequestException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpRequestException.java
index beb44271..06437a87 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpRequestException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpRequestException.java
@@ -9,12 +9,25 @@ public class HttpRequestException extends RuntimeException {
protected final int code;
protected final Object data;
- public HttpRequestException(int code, Object data) {
+ public HttpRequestException(
+ int code,
+ Object data
+ ) {
super("code: " + code + ", data: " + data);
this.code = code;
this.data = data;
}
+ public HttpRequestException(
+ int code,
+ Object data,
+ Throwable cause
+ ) {
+ super("code: " + code + ", data: " + data, cause);
+ this.code = code;
+ this.data = data;
+ }
+
@SuppressWarnings("unchecked")
public T getData() {
return (T) data;
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpRequestTimeoutException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpRequestTimeoutException.java
index a61bc63f..6861de47 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpRequestTimeoutException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpRequestTimeoutException.java
@@ -8,4 +8,8 @@ public class HttpRequestTimeoutException extends HttpRequestException {
public HttpRequestTimeoutException(Object data) {
super(StatusCodes.REQUEST_TIMEOUT, data);
}
+
+ public HttpRequestTimeoutException(Object data, Throwable cause) {
+ super(StatusCodes.REQUEST_TIMEOUT, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpTooManyRequestsException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpTooManyRequestsException.java
index 21bdb4b0..52f878d7 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpTooManyRequestsException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpTooManyRequestsException.java
@@ -8,4 +8,8 @@ public class HttpTooManyRequestsException extends HttpRequestException {
public HttpTooManyRequestsException(Object data) {
super(StatusCodes.TOO_MANY_REQUESTS, data);
}
+
+ public HttpTooManyRequestsException(Object data, Throwable cause) {
+ super(StatusCodes.TOO_MANY_REQUESTS, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpUnauthorizedException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpUnauthorizedException.java
index eeb5cf9c..50d8c35f 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpUnauthorizedException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpUnauthorizedException.java
@@ -8,4 +8,8 @@ public class HttpUnauthorizedException extends HttpRequestException {
public HttpUnauthorizedException(Object data) {
super(StatusCodes.UNAUTHORIZED, data);
}
+
+ public HttpUnauthorizedException(Object data, Throwable cause) {
+ super(StatusCodes.UNAUTHORIZED, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpUnsupportedMediaTypeException.java b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpUnsupportedMediaTypeException.java
index 5671426f..b6b494ab 100644
--- a/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpUnsupportedMediaTypeException.java
+++ b/ezyhttp-core/src/main/java/com/tvd12/ezyhttp/core/exception/HttpUnsupportedMediaTypeException.java
@@ -8,4 +8,8 @@ public class HttpUnsupportedMediaTypeException extends HttpRequestException {
public HttpUnsupportedMediaTypeException(Object data) {
super(StatusCodes.UNSUPPORTED_MEDIA_TYPE, data);
}
+
+ public HttpUnsupportedMediaTypeException(Object data, Throwable cause) {
+ super(StatusCodes.UNSUPPORTED_MEDIA_TYPE, data, cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/codec/SingletonStringDeserializerTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/codec/SingletonStringDeserializerTest.java
index 07df0da1..b29942af 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/codec/SingletonStringDeserializerTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/codec/SingletonStringDeserializerTest.java
@@ -380,6 +380,35 @@ public void deserializeEnumTest() throws Exception {
.deserialize("hello", MyEnum.class), MyEnum.HELLO);
}
+ @Test
+ public void deserializeOrNullTest() {
+ // given
+ // when
+ // then
+ Asserts.assertEquals(
+ SingletonStringDeserializer.getInstance()
+ .deserializeOrNull("1", int.class),
+ 1
+ );
+ Asserts.assertNull(
+ SingletonStringDeserializer.getInstance()
+ .deserializeOrNull("1", void.class)
+ );
+ Asserts.assertNull(
+ SingletonStringDeserializer.getInstance()
+ .deserializeOrNull(null, void.class)
+ );
+ Asserts.assertNull(
+ SingletonStringDeserializer.getInstance()
+ .deserializeOrNull("hello", Long.class)
+ );
+ Asserts.assertEquals(
+ SingletonStringDeserializer.getInstance()
+ .deserializeOrNull("WORLD", MyEnum.class),
+ MyEnum.WORLD
+ );
+ }
+
public enum MyEnum {
HELLO, WORLD
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpBadRequestExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpBadRequestExceptionTest.java
index e6dec6ee..c77e29c5 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpBadRequestExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpBadRequestExceptionTest.java
@@ -1,10 +1,9 @@
package com.tvd12.ezyhttp.core.test.exception;
-import org.testng.annotations.Test;
-
import com.tvd12.ezyhttp.core.constant.StatusCodes;
import com.tvd12.ezyhttp.core.exception.HttpBadRequestException;
import com.tvd12.test.assertion.Asserts;
+import org.testng.annotations.Test;
public class HttpBadRequestExceptionTest {
@@ -21,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.BAD_REQUEST;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpBadRequestException sut = new HttpBadRequestException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpConflictExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpConflictExceptionTest.java
index ba86fbfe..ef052051 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpConflictExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpConflictExceptionTest.java
@@ -1,10 +1,9 @@
package com.tvd12.ezyhttp.core.test.exception;
-import org.testng.annotations.Test;
-
import com.tvd12.ezyhttp.core.constant.StatusCodes;
import com.tvd12.ezyhttp.core.exception.HttpConflictException;
import com.tvd12.test.assertion.Asserts;
+import org.testng.annotations.Test;
public class HttpConflictExceptionTest {
@@ -21,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.CONFLICT;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpConflictException sut = new HttpConflictException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpForbiddenExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpForbiddenExceptionTest.java
index 90ce23a3..6560fe87 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpForbiddenExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpForbiddenExceptionTest.java
@@ -1,10 +1,9 @@
package com.tvd12.ezyhttp.core.test.exception;
-import org.testng.annotations.Test;
-
import com.tvd12.ezyhttp.core.constant.StatusCodes;
import com.tvd12.ezyhttp.core.exception.HttpForbiddenException;
import com.tvd12.test.assertion.Asserts;
+import org.testng.annotations.Test;
public class HttpForbiddenExceptionTest {
@@ -21,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.FORBIDDEN;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpForbiddenException sut = new HttpForbiddenException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpInternalServerErrorExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpInternalServerErrorExceptionTest.java
index c53c209f..5e8b03e8 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpInternalServerErrorExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpInternalServerErrorExceptionTest.java
@@ -1,10 +1,9 @@
package com.tvd12.ezyhttp.core.test.exception;
-import org.testng.annotations.Test;
-
import com.tvd12.ezyhttp.core.constant.StatusCodes;
import com.tvd12.ezyhttp.core.exception.HttpInternalServerErrorException;
import com.tvd12.test.assertion.Asserts;
+import org.testng.annotations.Test;
public class HttpInternalServerErrorExceptionTest {
@@ -21,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.INTERNAL_SERVER_ERROR;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpInternalServerErrorException sut = new HttpInternalServerErrorException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpMethodNotAllowedExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpMethodNotAllowedExceptionTest.java
index 54436231..b4d7a893 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpMethodNotAllowedExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpMethodNotAllowedExceptionTest.java
@@ -1,10 +1,9 @@
package com.tvd12.ezyhttp.core.test.exception;
-import org.testng.annotations.Test;
-
import com.tvd12.ezyhttp.core.constant.StatusCodes;
import com.tvd12.ezyhttp.core.exception.HttpMethodNotAllowedException;
import com.tvd12.test.assertion.Asserts;
+import org.testng.annotations.Test;
public class HttpMethodNotAllowedExceptionTest {
@@ -21,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.METHOD_NOT_ALLOWED;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpMethodNotAllowedException sut = new HttpMethodNotAllowedException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpNotAcceptableExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpNotAcceptableExceptionTest.java
index 66c2556c..9b0a8fb1 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpNotAcceptableExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpNotAcceptableExceptionTest.java
@@ -1,10 +1,9 @@
package com.tvd12.ezyhttp.core.test.exception;
-import org.testng.annotations.Test;
-
import com.tvd12.ezyhttp.core.constant.StatusCodes;
import com.tvd12.ezyhttp.core.exception.HttpNotAcceptableException;
import com.tvd12.test.assertion.Asserts;
+import org.testng.annotations.Test;
public class HttpNotAcceptableExceptionTest {
@@ -21,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.NOT_ACCEPTABLE;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpNotAcceptableException sut = new HttpNotAcceptableException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpNotFoundExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpNotFoundExceptionTest.java
index e192eb8b..9c8b8ef2 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpNotFoundExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpNotFoundExceptionTest.java
@@ -1,10 +1,9 @@
package com.tvd12.ezyhttp.core.test.exception;
-import org.testng.annotations.Test;
-
import com.tvd12.ezyhttp.core.constant.StatusCodes;
import com.tvd12.ezyhttp.core.exception.HttpNotFoundException;
import com.tvd12.test.assertion.Asserts;
+import org.testng.annotations.Test;
public class HttpNotFoundExceptionTest {
@@ -21,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.NOT_FOUND;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpNotFoundException sut = new HttpNotFoundException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpPaymentRequiredExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpPaymentRequiredExceptionTest.java
index 404772e6..71340ebe 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpPaymentRequiredExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpPaymentRequiredExceptionTest.java
@@ -20,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.PAYMENT_REQUIRED;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpPaymentRequiredException sut = new HttpPaymentRequiredException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpRequestExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpRequestExceptionTest.java
index 8924ed9d..72342417 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpRequestExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpRequestExceptionTest.java
@@ -1,10 +1,9 @@
package com.tvd12.ezyhttp.core.test.exception;
-import org.testng.annotations.Test;
-
import com.tvd12.ezyhttp.core.constant.StatusCodes;
import com.tvd12.ezyhttp.core.exception.HttpRequestException;
import com.tvd12.test.assertion.Asserts;
+import org.testng.annotations.Test;
public class HttpRequestExceptionTest {
@@ -21,4 +20,24 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.BAD_REQUEST;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpRequestException sut = new HttpRequestException(
+ code,
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpRequestTimeoutExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpRequestTimeoutExceptionTest.java
index 20604e55..39d5f08d 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpRequestTimeoutExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpRequestTimeoutExceptionTest.java
@@ -1,10 +1,9 @@
package com.tvd12.ezyhttp.core.test.exception;
-import org.testng.annotations.Test;
-
import com.tvd12.ezyhttp.core.constant.StatusCodes;
import com.tvd12.ezyhttp.core.exception.HttpRequestTimeoutException;
import com.tvd12.test.assertion.Asserts;
+import org.testng.annotations.Test;
public class HttpRequestTimeoutExceptionTest {
@@ -21,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.REQUEST_TIMEOUT;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpRequestTimeoutException sut = new HttpRequestTimeoutException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpTooManyRequestsExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpTooManyRequestsExceptionTest.java
index d4411190..619c9823 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpTooManyRequestsExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpTooManyRequestsExceptionTest.java
@@ -20,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.TOO_MANY_REQUESTS;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpTooManyRequestsException sut = new HttpTooManyRequestsException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpUnauthorizedExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpUnauthorizedExceptionTest.java
index a946c330..71a88cc7 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpUnauthorizedExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpUnauthorizedExceptionTest.java
@@ -1,10 +1,9 @@
package com.tvd12.ezyhttp.core.test.exception;
-import org.testng.annotations.Test;
-
import com.tvd12.ezyhttp.core.constant.StatusCodes;
import com.tvd12.ezyhttp.core.exception.HttpUnauthorizedException;
import com.tvd12.test.assertion.Asserts;
+import org.testng.annotations.Test;
public class HttpUnauthorizedExceptionTest {
@@ -21,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.UNAUTHORIZED;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpUnauthorizedException sut = new HttpUnauthorizedException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpUnsupportedMediaTypeExceptionTest.java b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpUnsupportedMediaTypeExceptionTest.java
index 2e1abffb..7b0a1101 100644
--- a/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpUnsupportedMediaTypeExceptionTest.java
+++ b/ezyhttp-core/src/test/java/com/tvd12/ezyhttp/core/test/exception/HttpUnsupportedMediaTypeExceptionTest.java
@@ -1,10 +1,9 @@
package com.tvd12.ezyhttp.core.test.exception;
-import org.testng.annotations.Test;
-
import com.tvd12.ezyhttp.core.constant.StatusCodes;
import com.tvd12.ezyhttp.core.exception.HttpUnsupportedMediaTypeException;
import com.tvd12.test.assertion.Asserts;
+import org.testng.annotations.Test;
public class HttpUnsupportedMediaTypeExceptionTest {
@@ -21,4 +20,23 @@ public void test() {
Asserts.assertEquals(code, sut.getCode());
Asserts.assertEquals(data, sut.getData());
}
+
+ @Test
+ public void withCauseTest() {
+ // given
+ int code = StatusCodes.UNSUPPORTED_MEDIA_TYPE;
+ String data = "error";
+ Exception cause = new Exception("test");
+
+ // when
+ HttpUnsupportedMediaTypeException sut = new HttpUnsupportedMediaTypeException(
+ data,
+ cause
+ );
+
+ // then
+ Asserts.assertEquals(code, sut.getCode());
+ Asserts.assertEquals(data, sut.getData());
+ Asserts.assertEquals(sut.getCause(), cause);
+ }
}
diff --git a/ezyhttp-server-boot/src/test/java/com/tvd12/ezyhttp/server/boot/test/controller/CustomerController.java b/ezyhttp-server-boot/src/test/java/com/tvd12/ezyhttp/server/boot/test/controller/CustomerController.java
index 837cb17a..3808dcba 100644
--- a/ezyhttp-server-boot/src/test/java/com/tvd12/ezyhttp/server/boot/test/controller/CustomerController.java
+++ b/ezyhttp-server-boot/src/test/java/com/tvd12/ezyhttp/server/boot/test/controller/CustomerController.java
@@ -80,7 +80,7 @@ protected void validateCustomer(Customer customer) {
if (customer.getAge() < 1)
errors.put("age", "invalid");
}
- if (errors.size() > 0)
+ if (!errors.isEmpty())
throw new HttpBadRequestException(errors);
}
}
diff --git a/ezyhttp-server-boot/src/test/java/com/tvd12/ezyhttp/server/boot/test/graphql/GraphQLHeroDataFetcher.java b/ezyhttp-server-boot/src/test/java/com/tvd12/ezyhttp/server/boot/test/graphql/GraphQLHeroDataFetcher.java
index 44e34e14..d341e9e2 100644
--- a/ezyhttp-server-boot/src/test/java/com/tvd12/ezyhttp/server/boot/test/graphql/GraphQLHeroDataFetcher.java
+++ b/ezyhttp-server-boot/src/test/java/com/tvd12/ezyhttp/server/boot/test/graphql/GraphQLHeroDataFetcher.java
@@ -3,13 +3,17 @@
import com.tvd12.ezyfox.bean.annotation.EzySingleton;
import com.tvd12.ezyhttp.server.core.request.RequestArguments;
import com.tvd12.ezyhttp.server.graphql.fetcher.GraphQLAbstractDataFetcher;
+import com.tvd12.ezyhttp.server.graphql.query.GraphQLQueryDefinition;
@EzySingleton
public class GraphQLHeroDataFetcher
- extends GraphQLAbstractDataFetcher
+ */
+ public T getFieldArgumentValue(
+ String argumentName,
+ String... fieldNames
+ ) {
+ GraphQLField field = this;
+ for (String fieldName : fieldNames) {
+ field = fieldByName.get(fieldName);
+ if (field == null) {
+ break;
+ }
+ }
+ return field != null
+ ? field.getArgumentValue(argumentName)
+ : null;
+ }
+
+ /**
+ * Retrieves the value of a specified argument from a nested GraphQL field path
+ * and transforms it into the desired type.
+ *
+ * @param argumentName the name of the argument to retrieve.
+ * @param type the target class type to which the argument value should be converted.
+ * @param fieldNames the sequence of nested field names to traverse in order to reach
+ * the target field.
+ * @param the expected return type.
+ * @return the transformed value of the specified argument if found and convertible;
+ * otherwise, null.
+ *
+ * How it works:
+ * - Delegates to {@link #getFieldArgumentValue(String, String...)} to retrieve
+ * the raw argument value.
+ * - If the value is non-null, uses {@code EzySingletonOutputTransformer} to transform
+ * it into the specified type.
+ * - Returns null if the argument is not found or the value is null.
+ *