Skip to content

Commit 531b51f

Browse files
committed
Support Jakarta DecimalMin
1 parent ded32fc commit 531b51f

File tree

4 files changed

+105
-5
lines changed

4 files changed

+105
-5
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package example.jakarta;
2+
3+
import jakarta.validation.Valid;
4+
import jakarta.validation.constraints.DecimalMax;
5+
import jakarta.validation.constraints.DecimalMin;
6+
import jakarta.validation.constraints.Digits;
7+
8+
import java.math.BigDecimal;
9+
10+
@Valid
11+
public class JMyMinNumbers {
12+
13+
@DecimalMin("10.50")
14+
final BigDecimal price;
15+
16+
@DecimalMin(value = "9.30", inclusive = false)
17+
final BigDecimal priceInc;
18+
19+
public JMyMinNumbers(BigDecimal price, BigDecimal priceInc) {
20+
this.price = price;
21+
this.priceInc = priceInc;
22+
}
23+
24+
public BigDecimal price() {
25+
return price;
26+
}
27+
28+
public BigDecimal priceInc() {
29+
return priceInc;
30+
}
31+
32+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package example.jakarta;
2+
3+
import io.avaje.validation.ConstraintViolation;
4+
import io.avaje.validation.ConstraintViolationException;
5+
import io.avaje.validation.Validator;
6+
import org.junit.jupiter.api.Test;
7+
8+
import java.math.BigDecimal;
9+
import java.util.ArrayList;
10+
import java.util.Locale;
11+
12+
import static java.math.BigDecimal.ONE;
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
import static org.assertj.core.api.Assertions.fail;
15+
16+
class JMyMinNumbersTest {
17+
18+
final Validator validator = Validator.builder().build();
19+
20+
final BigDecimal valid = new BigDecimal("20");
21+
22+
@Test
23+
void valid() {
24+
var bean = new JMyMinNumbers(valid, valid);
25+
validator.validate(bean);
26+
}
27+
28+
@Test
29+
void decimalMin() {
30+
var violation = one(new JMyMinNumbers(ONE, valid));
31+
assertThat(violation.message()).isEqualTo("must be greater than or equal to 10.50");
32+
}
33+
34+
@Test
35+
void decimalMinDE() {
36+
var violation = one(new JMyMinNumbers(ONE, valid), Locale.GERMAN);
37+
assertThat(violation.message()).isEqualTo("muss größer oder gleich 10.50 sein");
38+
}
39+
40+
@Test
41+
void decimalMinExclusive() {
42+
var violation = one(new JMyMinNumbers(valid, ONE));
43+
assertThat(violation.message()).isEqualTo("must be greater than 9.30");
44+
}
45+
46+
@Test
47+
void decimalMaxExclusiveDE() {
48+
var violation = one(new JMyMinNumbers(valid, ONE), Locale.GERMAN);
49+
assertThat(violation.message()).isEqualTo("muss größer 9.30 sein");
50+
}
51+
52+
ConstraintViolation one(Object any) {
53+
return one(any, Locale.ENGLISH);
54+
}
55+
56+
ConstraintViolation one(Object any, Locale locale) {
57+
try {
58+
validator.validate(any, locale);
59+
fail("not expected");
60+
return null;
61+
} catch (ConstraintViolationException e) {
62+
var violations = new ArrayList<>(e.violations());
63+
assertThat(violations).hasSize(1);
64+
return violations.get(0);
65+
}
66+
}
67+
}

validator-generator/src/main/java/io/avaje/validation/generator/AnnotationUtil.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ interface Handler {
2424

2525
final var jakartaDecimal = new JakartaDecimal();
2626
handlers.put("jakarta.validation.constraints.DecimalMax", jakartaDecimal);
27+
handlers.put("jakarta.validation.constraints.DecimalMin", jakartaDecimal);
2728
}
2829

2930
private AnnotationUtil() {}
@@ -209,7 +210,7 @@ String messageKey(AnnotationValue defaultValue) {
209210
final boolean inclusive = (inclusiveValue == null || "true".equals(inclusiveValue.toString()));
210211
String messageKey = super.messageKey(defaultValue);
211212
if (!inclusive) {
212-
messageKey = messageKey.replace("DecimalMax.message", "DecimalMax.exclusive.message");
213+
messageKey = messageKey.replace(".message", ".exclusive.message");
213214
}
214215
return messageKey;
215216
}

validator/src/main/java/io/avaje/validation/core/adapters/NumberAdapters.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ private NumberAdapters() {}
2929
case "DecimalMax" -> new DecimalMaxAdapter(
3030
context.message2(attributes), attributes);
3131
case "DecimalMin" -> new DecimalMinAdapter(
32-
context.message("DecimalMin", attributes), attributes);
32+
context.message2(attributes), attributes);
3333

3434
default -> null;
3535
};
@@ -67,11 +67,11 @@ public boolean validate(Number number, ValidationRequest req, String propertyNam
6767

6868
private static final class DecimalMinAdapter implements ValidationAdapter<Number> {
6969

70-
private final String message;
70+
private final ValidationContext.Message message;
7171
private final BigDecimal value;
7272
private final boolean inclusive;
7373

74-
public DecimalMinAdapter(String message, Map<String, Object> attributes) {
74+
public DecimalMinAdapter(ValidationContext.Message message, Map<String, Object> attributes) {
7575
this.message = message;
7676
this.value = new BigDecimal((String) attributes.get("value"));
7777
this.inclusive = Optional.ofNullable((Boolean) attributes.get("inclusive")).orElse(true);
@@ -87,7 +87,7 @@ public boolean validate(Number number, ValidationRequest req, String propertyNam
8787

8888
final int comparisonResult = NumberComparatorHelper.compareDecimal(number, value, LESS_THAN);
8989

90-
if (inclusive ? comparisonResult >= 0 : comparisonResult > 0) {
90+
if (inclusive ? comparisonResult < 0 : comparisonResult <= 0) {
9191
req.addViolation(message, propertyName);
9292
return false;
9393
}

0 commit comments

Comments
 (0)