SlideShare a Scribd company logo
1 of 45
Download to read offline
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
1
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
▸
▸
▸
2
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
▸
▸ 

▸
▸
3
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
4
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
▸
▸
▸
▸ 💖
5
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
6
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
7
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
▸
▸
8
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
▸ 

▸
9
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
10
public class HelloDto {
@NotBlank(message = "{hello.notblank}")
private String message;
// getter/setter
}
@Path("/hello")
public class HelloResource {
@POST
public Response post(@Valid HelloDto helloDto) {
//
}
}


(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
11
hello.notblank	=	
▸
▸
hello.notblank = Message is required
hello.notblank =
ValidationMessages_ja.properties
ValidationMessages_en.properties
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
12
$	curl	-v	-X	POST		
		-H	"Content-Type:	application/json”		
		-d	‘{"message":""}'		
		http://localhost:8080/api/hello			
>	POST	/api/hello	HTTP/1.1	
>	…	
>	
<	HTTP/1.1	400	Bad	Request	
<	…	
<	
{	
		"errorType":" ",	
		"messages":[" "]	
}
※JSON ExceptionMapper
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
13
Bean Validation 

(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
14
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸ 👏
▸
15
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
▸
▸
▸
▸
16
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
17
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸ @NotNull	
▸ @Null	
▸ @NotEmpty	
▸ @NotBlank	
▸ @AssertTrue	
▸ @AssertFalse	
▸ @Size	
▸ @Pattern
18
▸ @Email	
▸ @Digits	
▸ @DecimalMax	
▸ @DecimalMin	
▸ @Max	
▸ @Min	
▸ @Positive	
▸ @PositiveOrZero
▸ @Negative	
▸ @NegativeOrZero	
▸ @Past	
▸ @PastOrPresent	
▸ @Future	
▸ @FutureOrPresent
※
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
19
@NotBlank CharSequence
null 	
❌
@NotEmpty


null 0 ❌
@Email CharSequence
❌
@Positive ❌
@PositiveOrZero 0 ❌
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
20
@Negative ❌
@NegativeOrZero 0 ❌
@PastOrPresent
Date Calendar 	
java.time.*
	
❌
@FutureOrPresent
Date Calendar 	
java.time.*
	
❌
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸ @NotBlank @NotEmpty @Email 👏
▸ 

▸ 👏
▸ @Past @PastOrPresent @Future
@FutureOrPresent
21
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸ @Past 

👏
▸ @Max/@Positive 

javax.money.MonetaryAmount
👏
▸ 

22
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
23
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
24
public class Sample {
private Optional<@Size(min = 3) String> optionalString;
private List<@NotNull String> list = new ArrayList<>();
		//	omitted	
}
▸ 👏
▸
※JSR Container element constraints
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸ OptionalXxx java.util.OptionalInt 

XxxProperty IntegerProperty 

👏
25
public class Sample {
@Max(10)
private OptionalInt optionalInt;
		//	omitted	
}
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
26
@Test
public void test() {
Sample sample = new Sample();
sample.addToOptionalString(“aa"); // 3
sample.addToList(null); // not null
sample.addToOptionalInt(20); // 10
//
Set<ConstraintViolation<Sample>> violations =
validator.validate(sample);
//
assertEquals(3, violations.size());
}
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
27
@Test
public void test2() {
Sample sample = new Sample();
sample.addToList(null); // not null 1
sample.addToList(null); // not null 2
//
Set<ConstraintViolation<Sample>> violations =
validator.validate(sample);
//
assertEquals(2, violations.size());
}
▸
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
28
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
@Max(value = 100, groups = Group1.class)
@Max(value = 200, groups = Group2.class)
int	someValue;
▸
▸ @Xxx.List 👏
29
@Max.List({
@Max(value = 100, groups = Group1.class),
@Max(value = 200, groups = Group2.class)
})
int	someValue;
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
ParameterNameProvider
👏
▸ -parameters
30
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸ ConstraintValidator
initialize()
▸
31
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
32
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
👏
33
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
34
<web-app …>
<context-param>
<param-name>
javax.faces.validator.ENABLE_VALIDATE_WHOLE_BEAN
</param-name>
<param-value>true</param-value>
</context-param>
<!-- omitted -->
</web-app>




(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
35
public class EqualsValidator
implements ConstraintValidator<Equals, Object> {
@Override
public boolean isValid(Object obj,
ConstraintValidatorContext context) {
// 2
// true
}
@Constraint(validatedBy = EqualsValidator.class)
public @interface Equals {
String property1(); // 1
String property2(); // 2
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
36
@Named
@ViewScoped
@Equals(property1 = "email1", property2 = "email2",
message = “…”)
public class CompareBean implements Serializable {
@NotBlank(message = “…”)
@Size(min = 3, message = “…”)
private String email1;
@NotBlank(message = “…”)
@Size(min = 3, message = “…”)
private String email2;
				//	omitted




(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
37
<h:form id="email-form">
<h:inputText value="#{compareBean.email1}"/><br/>
<h:inputText value="#{compareBean.email2}"/><br/>
<h:commandButton value=“ "
action="#{compareBean.submit()}"/>
<f:validateWholeBean value="#{compareBean}"/>
</h:form>
Managed Bean
※<f:validateBean/> validationGroups
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸ 



▸ 

38
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸ <f:validateWholeBean> 

▸
39※ h:commandButton
<h:form id="email-form">
<h:inputText value=“…”/><br/>
<h:inputText value=“…”/><br/>
<h:commandButton value=“ " action=“…”/>
<f:validateWholeBean value="#{compareBean}"/>
</h:form>
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
40
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
▸ @NotBlank @NotEmpty @Email
▸ Optional
▸
41
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
▸
▸
▸
42
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸ 😆
▸
😆
▸
😭
43
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
▸
▸
▸
▸
▸
▸
▸
44
(C) CASAREAL, Inc. All rights reserved.
#glassfish_jp
▸
45

More Related Content

What's hot

はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)Masatoshi Tada
 
基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装Masatoshi Tada
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーションssuser070fa9
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション土岐 孝平
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugMasatoshi Tada
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところY Watanabe
 
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説Masatoshi Tada
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャーssuser070fa9
 
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方Takahiro YAMADA
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話KEISUKE KONISHI
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるMasatoshi Tada
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング佑哉 廣岡
 
Kibanaでsysstatを可視化する
Kibanaでsysstatを可視化するKibanaでsysstatを可視化する
Kibanaでsysstatを可視化するKensuke Maeda
 
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界Y Watanabe
 
Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎Masayuki Ozawa
 
Demystifying Identities for Azure Kubernetes Service
Demystifying Identities for Azure Kubernetes ServiceDemystifying Identities for Azure Kubernetes Service
Demystifying Identities for Azure Kubernetes ServiceToru Makabe
 

What's hot (20)

はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
 
基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
ReactiveだけじゃないSpring 5 & Spring Boot 2新機能解説
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
 
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みる
 
Helidon 概要
Helidon 概要Helidon 概要
Helidon 概要
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
 
Kibanaでsysstatを可視化する
Kibanaでsysstatを可視化するKibanaでsysstatを可視化する
Kibanaでsysstatを可視化する
 
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
 
Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎Sql server のバックアップとリストアの基礎
Sql server のバックアップとリストアの基礎
 
Demystifying Identities for Azure Kubernetes Service
Demystifying Identities for Azure Kubernetes ServiceDemystifying Identities for Azure Kubernetes Service
Demystifying Identities for Azure Kubernetes Service
 

More from Masatoshi Tada

これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線MeetupMasatoshi Tada
 
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccMasatoshi Tada
 
JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会Masatoshi Tada
 
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~Masatoshi Tada
 
Getting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafGetting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafMasatoshi Tada
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallMasatoshi Tada
 
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Masatoshi Tada
 
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho ltNetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho ltMasatoshi Tada
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2Masatoshi Tada
 
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_cccJPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_cccMasatoshi Tada
 

More from Masatoshi Tada (10)

これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetupこれで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
これで怖くない!?コードリーディングで学ぶSpring Security #中央線Meetup
 
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
 
JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会
 
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
Java EEでもOAuth 2.0!~そしてPayara Micro on Cloud Foundryで遊ぶ~
 
Getting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with ThymeleafGetting start Java EE Action-Based MVC with Thymeleaf
Getting start Java EE Action-Based MVC with Thymeleaf
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 Fall
 
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
 
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho ltNetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
NetBeansでかんたんJava EE ○分間クッキング! #kuwaccho lt
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
 
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_cccJPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
JPAの同時実行制御とロック20140518 #ccc_r15 #jjug_ccc
 

Recently uploaded

Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 

Recently uploaded (20)

Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 

Java EE 8新機能解説 -Bean Validation 2.0編-

  • 1. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 1
  • 2. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ ▸ ▸ ▸ 2
  • 3. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ ▸ ▸ 
 ▸ ▸ 3
  • 4. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ 4
  • 5. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ ▸ ▸ ▸ ▸ 💖 5
  • 6. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 6
  • 7. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 7
  • 8. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ ▸ ▸ 8
  • 9. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ ▸ 
 ▸ 9
  • 10. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 10 public class HelloDto { @NotBlank(message = "{hello.notblank}") private String message; // getter/setter } @Path("/hello") public class HelloResource { @POST public Response post(@Valid HelloDto helloDto) { // } } 

  • 11. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ 11 hello.notblank = ▸ ▸ hello.notblank = Message is required hello.notblank = ValidationMessages_ja.properties ValidationMessages_en.properties
  • 12. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 12 $ curl -v -X POST -H "Content-Type: application/json” -d ‘{"message":""}' http://localhost:8080/api/hello > POST /api/hello HTTP/1.1 > … > < HTTP/1.1 400 Bad Request < … < { "errorType":" ", "messages":[" "] } ※JSON ExceptionMapper
  • 13. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ 13 Bean Validation 

  • 14. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 14
  • 15. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ 👏 ▸ 15
  • 16. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ ▸ ▸ ▸ ▸ 16
  • 17. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 17
  • 18. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ @NotNull ▸ @Null ▸ @NotEmpty ▸ @NotBlank ▸ @AssertTrue ▸ @AssertFalse ▸ @Size ▸ @Pattern 18 ▸ @Email ▸ @Digits ▸ @DecimalMax ▸ @DecimalMin ▸ @Max ▸ @Min ▸ @Positive ▸ @PositiveOrZero ▸ @Negative ▸ @NegativeOrZero ▸ @Past ▸ @PastOrPresent ▸ @Future ▸ @FutureOrPresent ※
  • 19. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 19 @NotBlank CharSequence null ❌ @NotEmpty 
 null 0 ❌ @Email CharSequence ❌ @Positive ❌ @PositiveOrZero 0 ❌
  • 20. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 20 @Negative ❌ @NegativeOrZero 0 ❌ @PastOrPresent Date Calendar java.time.* ❌ @FutureOrPresent Date Calendar java.time.* ❌
  • 21. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ @NotBlank @NotEmpty @Email 👏 ▸ 
 ▸ 👏 ▸ @Past @PastOrPresent @Future @FutureOrPresent 21
  • 22. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ @Past 
 👏 ▸ @Max/@Positive 
 javax.money.MonetaryAmount 👏 ▸ 
 22
  • 23. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 23
  • 24. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 24 public class Sample { private Optional<@Size(min = 3) String> optionalString; private List<@NotNull String> list = new ArrayList<>(); // omitted } ▸ 👏 ▸ ※JSR Container element constraints
  • 25. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ OptionalXxx java.util.OptionalInt 
 XxxProperty IntegerProperty 
 👏 25 public class Sample { @Max(10) private OptionalInt optionalInt; // omitted }
  • 26. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 26 @Test public void test() { Sample sample = new Sample(); sample.addToOptionalString(“aa"); // 3 sample.addToList(null); // not null sample.addToOptionalInt(20); // 10 // Set<ConstraintViolation<Sample>> violations = validator.validate(sample); // assertEquals(3, violations.size()); }
  • 27. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 27 @Test public void test2() { Sample sample = new Sample(); sample.addToList(null); // not null 1 sample.addToList(null); // not null 2 // Set<ConstraintViolation<Sample>> violations = validator.validate(sample); // assertEquals(2, violations.size()); } ▸
  • 28. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 28
  • 29. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp @Max(value = 100, groups = Group1.class) @Max(value = 200, groups = Group2.class) int someValue; ▸ ▸ @Xxx.List 👏 29 @Max.List({ @Max(value = 100, groups = Group1.class), @Max(value = 200, groups = Group2.class) }) int someValue;
  • 30. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ ParameterNameProvider 👏 ▸ -parameters 30
  • 31. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ ConstraintValidator initialize() ▸ 31
  • 32. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 32
  • 33. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ 👏 33
  • 34. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 34 <web-app …> <context-param> <param-name> javax.faces.validator.ENABLE_VALIDATE_WHOLE_BEAN </param-name> <param-value>true</param-value> </context-param> <!-- omitted --> </web-app> 
 

  • 35. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 35 public class EqualsValidator implements ConstraintValidator<Equals, Object> { @Override public boolean isValid(Object obj, ConstraintValidatorContext context) { // 2 // true } @Constraint(validatedBy = EqualsValidator.class) public @interface Equals { String property1(); // 1 String property2(); // 2
  • 36. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 36 @Named @ViewScoped @Equals(property1 = "email1", property2 = "email2", message = “…”) public class CompareBean implements Serializable { @NotBlank(message = “…”) @Size(min = 3, message = “…”) private String email1; @NotBlank(message = “…”) @Size(min = 3, message = “…”) private String email2; // omitted 
 

  • 37. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 37 <h:form id="email-form"> <h:inputText value="#{compareBean.email1}"/><br/> <h:inputText value="#{compareBean.email2}"/><br/> <h:commandButton value=“ " action="#{compareBean.submit()}"/> <f:validateWholeBean value="#{compareBean}"/> </h:form> Managed Bean ※<f:validateBean/> validationGroups
  • 38. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ 
 
 ▸ 
 38
  • 39. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ <f:validateWholeBean> 
 ▸ 39※ h:commandButton <h:form id="email-form"> <h:inputText value=“…”/><br/> <h:inputText value=“…”/><br/> <h:commandButton value=“ " action=“…”/> <f:validateWholeBean value="#{compareBean}"/> </h:form>
  • 40. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp 40
  • 41. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ ▸ @NotBlank @NotEmpty @Email ▸ Optional ▸ 41
  • 42. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ ▸ ▸ ▸ 42
  • 43. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ 😆 ▸ 😆 ▸ 😭 43
  • 44. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ ▸ ▸ ▸ ▸ ▸ ▸ ▸ 44
  • 45. (C) CASAREAL, Inc. All rights reserved. #glassfish_jp ▸ 45