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

怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション土岐 孝平
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
20190911 AWS Black Belt Online Seminar AWS Batch
20190911 AWS Black Belt Online Seminar AWS Batch20190911 AWS Black Belt Online Seminar AWS Batch
20190911 AWS Black Belt Online Seminar AWS BatchAmazon Web Services Japan
 
20180704(20190520 Renewed) AWS Black Belt Online Seminar Amazon Elastic File ...
20180704(20190520 Renewed) AWS Black Belt Online Seminar Amazon Elastic File ...20180704(20190520 Renewed) AWS Black Belt Online Seminar Amazon Elastic File ...
20180704(20190520 Renewed) AWS Black Belt Online Seminar Amazon Elastic File ...Amazon Web Services Japan
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるMasatoshi Tada
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
20190723 AWS Black Belt Online Seminar AWS CloudHSM
20190723 AWS Black Belt Online Seminar AWS CloudHSM 20190723 AWS Black Belt Online Seminar AWS CloudHSM
20190723 AWS Black Belt Online Seminar AWS CloudHSM Amazon Web Services Japan
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
ログ管理のベストプラクティス
ログ管理のベストプラクティスログ管理のベストプラクティス
ログ管理のベストプラクティスAkihiro Kuwano
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みTakeshi Ogawa
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Ryosuke Uchitate
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Amazon Web Services Japan
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き土岐 孝平
 
決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話Ryosuke Uchitate
 
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをなAmazon Web Services Japan
 
AWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct ConnectAWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct ConnectAmazon Web Services Japan
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
 

What's hot (20)

怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
 
20190911 AWS Black Belt Online Seminar AWS Batch
20190911 AWS Black Belt Online Seminar AWS Batch20190911 AWS Black Belt Online Seminar AWS Batch
20190911 AWS Black Belt Online Seminar AWS Batch
 
20180704(20190520 Renewed) AWS Black Belt Online Seminar Amazon Elastic File ...
20180704(20190520 Renewed) AWS Black Belt Online Seminar Amazon Elastic File ...20180704(20190520 Renewed) AWS Black Belt Online Seminar Amazon Elastic File ...
20180704(20190520 Renewed) AWS Black Belt Online Seminar Amazon Elastic File ...
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みる
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
20190723 AWS Black Belt Online Seminar AWS CloudHSM
20190723 AWS Black Belt Online Seminar AWS CloudHSM 20190723 AWS Black Belt Online Seminar AWS CloudHSM
20190723 AWS Black Belt Online Seminar AWS CloudHSM
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
ログ管理のベストプラクティス
ログ管理のベストプラクティスログ管理のベストプラクティス
ログ管理のベストプラクティス
 
NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
 
決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話
 
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
 
AWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct ConnectAWS Black Belt Techシリーズ AWS Direct Connect
AWS Black Belt Techシリーズ AWS Direct Connect
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 

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

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
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugMasatoshi Tada
 
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 Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsugSpring Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsugMasatoshi Tada
 
JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会Masatoshi Tada
 
保守・追加開発に必要な「Springの正しい知識」とは?20171109
保守・追加開発に必要な「Springの正しい知識」とは?20171109保守・追加開発に必要な「Springの正しい知識」とは?20171109
保守・追加開発に必要な「Springの正しい知識」とは?20171109CASAREAL, Inc.
 

Similar to Java EE 8新機能解説 -Bean Validation 2.0編- (6)

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で遊ぶ~
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
 
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 Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsugSpring Data JPAによるデータアクセス徹底入門 #jsug
Spring Data JPAによるデータアクセス徹底入門 #jsug
 
JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会JSUG SpringOne 2017報告会
JSUG SpringOne 2017報告会
 
保守・追加開発に必要な「Springの正しい知識」とは?20171109
保守・追加開発に必要な「Springの正しい知識」とは?20171109保守・追加開発に必要な「Springの正しい知識」とは?20171109
保守・追加開発に必要な「Springの正しい知識」とは?20171109
 

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
 
基礎からの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
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー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
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)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 (11)

これで怖くない!?コードリーディングで学ぶ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
 
基礎からの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による実装
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
 
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更新
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
 
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

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
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
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
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
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
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
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
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 

Recently uploaded (20)

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
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
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
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
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
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 

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