Skip to content

Commit 3a58b70

Browse files
committed
いろいろ触った(とてもひどいコミットログ)
1 parent 2ed11f1 commit 3a58b70

11 files changed

+333
-28
lines changed

validation-example/src/main/java/com/example/BindExceptionHandler.java

Lines changed: 0 additions & 28 deletions
This file was deleted.

validation-example/src/main/java/com/example/example1/SpringValidatorExampleController.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,29 @@
11
package com.example.example1;
22

3+
import java.util.Locale;
4+
import java.util.stream.Collectors;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.context.MessageSource;
7+
import org.springframework.http.HttpStatus;
8+
import org.springframework.validation.BindException;
39
import org.springframework.validation.Errors;
410
import org.springframework.validation.Validator;
511
import org.springframework.validation.annotation.Validated;
612
import org.springframework.web.bind.WebDataBinder;
13+
import org.springframework.web.bind.annotation.ExceptionHandler;
714
import org.springframework.web.bind.annotation.InitBinder;
815
import org.springframework.web.bind.annotation.PostMapping;
916
import org.springframework.web.bind.annotation.RequestMapping;
17+
import org.springframework.web.bind.annotation.ResponseStatus;
1018
import org.springframework.web.bind.annotation.RestController;
1119

1220
@RestController
1321
@RequestMapping("/1")
1422
public class SpringValidatorExampleController {
1523

24+
@Autowired
25+
private MessageSource messageSource;
26+
1627
@InitBinder
1728
void init(final WebDataBinder binder) {
1829
binder.setValidator(new ExampleFormValidator());
@@ -22,6 +33,14 @@ void init(final WebDataBinder binder) {
2233
public String post(@Validated final ExampleForm form) {
2334
return "Valid";
2435
}
36+
37+
@ExceptionHandler(BindException.class)
38+
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
39+
String handle(BindException e, Locale locale) {
40+
return e.getAllErrors().stream()
41+
.map(a -> messageSource.getMessage(a, locale))
42+
.collect(Collectors.joining("\n"));
43+
}
2544
}
2645

2746
class ExampleForm {

validation-example/src/main/java/com/example/example2/BeanValidationExampleController.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,16 @@
33
import jakarta.validation.Valid;
44
import jakarta.validation.constraints.NotNull;
55
import jakarta.validation.constraints.Size;
6+
import java.util.Locale;
7+
import java.util.stream.Collectors;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.context.MessageSource;
10+
import org.springframework.http.HttpStatus;
11+
import org.springframework.validation.BindException;
12+
import org.springframework.web.bind.annotation.ExceptionHandler;
613
import org.springframework.web.bind.annotation.PostMapping;
714
import org.springframework.web.bind.annotation.RequestMapping;
15+
import org.springframework.web.bind.annotation.ResponseStatus;
816
import org.springframework.web.bind.annotation.RestController;
917

1018
/**
@@ -15,10 +23,21 @@
1523
@RequestMapping("/2")
1624
public class BeanValidationExampleController {
1725

26+
@Autowired
27+
private MessageSource messageSource;
28+
1829
@PostMapping
1930
public String post(@Valid final ExampleForm form) {
2031
return "Valid";
2132
}
33+
34+
@ExceptionHandler(BindException.class)
35+
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
36+
String handle(BindException e, Locale locale) {
37+
return e.getAllErrors().stream()
38+
.map(a -> messageSource.getMessage(a, locale))
39+
.collect(Collectors.joining("\n"));
40+
}
2241
}
2342

2443
class ExampleForm {

validation-example/src/main/java/com/example/example3/CustomValidationExampleController.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,44 @@
55
import java.lang.annotation.Retention;
66
import java.lang.annotation.RetentionPolicy;
77
import java.lang.reflect.Field;
8+
import java.util.Locale;
9+
import java.util.stream.Collectors;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.context.MessageSource;
812
import org.springframework.core.annotation.AnnotationUtils;
13+
import org.springframework.http.HttpStatus;
914
import org.springframework.util.ReflectionUtils;
15+
import org.springframework.validation.BindException;
1016
import org.springframework.validation.Errors;
1117
import org.springframework.validation.Validator;
1218
import org.springframework.web.bind.WebDataBinder;
19+
import org.springframework.web.bind.annotation.ExceptionHandler;
1320
import org.springframework.web.bind.annotation.InitBinder;
1421
import org.springframework.web.bind.annotation.PostMapping;
1522
import org.springframework.web.bind.annotation.RequestMapping;
23+
import org.springframework.web.bind.annotation.ResponseStatus;
1624
import org.springframework.web.bind.annotation.RestController;
1725
import org.springframework.web.bind.annotation.RestControllerAdvice;
1826

1927
@RestController
2028
@RequestMapping("/3")
2129
public class CustomValidationExampleController {
2230

31+
@Autowired
32+
private MessageSource messageSource;
33+
2334
@PostMapping
2435
public String post(@Valid final ExampleForm form) {
2536
return "Valid";
2637
}
38+
39+
@ExceptionHandler(BindException.class)
40+
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
41+
String handle(BindException e, Locale locale) {
42+
return e.getAllErrors().stream()
43+
.map(a -> messageSource.getMessage(a, locale))
44+
.collect(Collectors.joining("\n"));
45+
}
2746
}
2847

2948
class ExampleForm {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.example.example5;
2+
3+
import java.util.List;
4+
import java.util.Locale;
5+
import java.util.Map;
6+
import java.util.stream.Collectors;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.context.MessageSource;
9+
import org.springframework.http.HttpStatus;
10+
import org.springframework.http.ProblemDetail;
11+
import org.springframework.validation.BindException;
12+
import org.springframework.web.bind.WebDataBinder;
13+
import org.springframework.web.bind.annotation.ExceptionHandler;
14+
import org.springframework.web.bind.annotation.InitBinder;
15+
import org.springframework.web.bind.annotation.RestControllerAdvice;
16+
import org.springframework.web.context.request.NativeWebRequest;
17+
18+
@RestControllerAdvice(basePackageClasses = SpringValidatorAndBeanValidationExampleController.class)
19+
public class Example5ControllerAdvice {
20+
21+
@Autowired
22+
private MessageSource messageSource;
23+
24+
@InitBinder
25+
public void initBinder(WebDataBinder webDataBinder, NativeWebRequest request) {
26+
webDataBinder.addValidators(new Example5SmartValidator(request));
27+
}
28+
29+
@ExceptionHandler(BindException.class)
30+
ProblemDetail handle(BindException e, final Locale locale) {
31+
Map<String, List<String>> fieldErrors = e.getFieldErrors().stream()
32+
.collect(Collectors.groupingBy(
33+
a -> a.getField(),
34+
Collectors.mapping(a -> messageSource.getMessage(a, locale), Collectors.toList())));
35+
List<String> globalErrors = e.getGlobalErrors().stream()
36+
.map(a -> messageSource.getMessage(a, locale))
37+
.toList();
38+
ProblemDetail problemDetail = ProblemDetail.forStatus(HttpStatus.BAD_REQUEST);
39+
problemDetail.setProperty("fieldErrors", fieldErrors);
40+
problemDetail.setProperty("globalErrors", globalErrors);
41+
return problemDetail;
42+
}
43+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.example.example5;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import jakarta.validation.constraints.NotEmpty;
5+
6+
public class Example5Request {
7+
8+
@NotEmpty
9+
private String foo;
10+
11+
@NotBlank
12+
private String bar;
13+
14+
public String getFoo() {
15+
return foo;
16+
}
17+
18+
public void setFoo(String foo) {
19+
this.foo = foo;
20+
}
21+
22+
public String getBar() {
23+
return bar;
24+
}
25+
26+
public void setBar(String bar) {
27+
this.bar = bar;
28+
}
29+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.example.example5;
2+
3+
import org.springframework.validation.Errors;
4+
import org.springframework.validation.SmartValidator;
5+
import org.springframework.web.context.request.NativeWebRequest;
6+
7+
public class Example5SmartValidator implements SmartValidator {
8+
9+
private final NativeWebRequest request;
10+
11+
public Example5SmartValidator(NativeWebRequest request) {
12+
this.request = request;
13+
}
14+
15+
@Override
16+
public boolean supports(Class<?> clazz) {
17+
return Example5Request.class.isAssignableFrom(clazz);
18+
}
19+
20+
@Override
21+
public void validate(Object target, Errors errors) {
22+
validate(target, errors, new Object[0]);
23+
}
24+
25+
@Override
26+
public void validate(Object target, Errors errors, Object... validationHints) {
27+
var baz = request.getParameter("baz");
28+
if (baz == null) {
29+
errors.reject("baz.error");
30+
}
31+
}
32+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.example.example5;
2+
3+
import org.springframework.validation.annotation.Validated;
4+
import org.springframework.web.bind.annotation.PostMapping;
5+
import org.springframework.web.bind.annotation.RequestBody;
6+
import org.springframework.web.bind.annotation.RequestMapping;
7+
import org.springframework.web.bind.annotation.RestController;
8+
9+
@RestController
10+
@RequestMapping("5")
11+
public class SpringValidatorAndBeanValidationExampleController {
12+
13+
@PostMapping
14+
public Object post(@RequestBody @Validated Example5Request request) {
15+
return null;
16+
}
17+
}

validation-example/src/main/resources/messages.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@ messageExampleForm.num=num item
88
messageExampleForm.vo=value object
99

1010
Size.messageExampleForm.text={0} size must be between {2} and {1}
11+
12+
baz.error=baz error
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.example.example5;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.api.Test;
5+
import org.springframework.boot.test.context.SpringBootTest;
6+
import org.springframework.http.HttpStatus;
7+
import org.springframework.http.MediaType;
8+
import org.springframework.test.web.servlet.assertj.MockMvcTester;
9+
import org.springframework.web.context.WebApplicationContext;
10+
11+
@SpringBootTest
12+
public class SpringValidatorAndBeanValidationExampleControllerTest {
13+
14+
private MockMvcTester tester;
15+
16+
@BeforeEach
17+
void setUp(WebApplicationContext wac) {
18+
tester = MockMvcTester.from(wac);
19+
}
20+
21+
@Test
22+
void test() throws Exception {
23+
tester.post()
24+
.uri("/5")
25+
.content("{}")
26+
.contentType(MediaType.APPLICATION_JSON)
27+
.assertThat()
28+
.hasStatus(HttpStatus.BAD_REQUEST)
29+
.bodyJson()
30+
.hasPathSatisfying("$.fieldErrors.foo[0]", a -> a.assertThat().isEqualTo("must not be empty"))
31+
.hasPathSatisfying("$.fieldErrors.bar[0]", a -> a.assertThat().isEqualTo("must not be blank"))
32+
.hasPathSatisfying("$.globalErrors[0]", a -> a.assertThat().isEqualTo("baz error"));
33+
}
34+
}

0 commit comments

Comments
 (0)