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

>100 Views

May 26, 22

スライド概要

GlassFish勉強会 2018 Springの資料です。

profile-image

Java、Spring、IntelliJ IDEA

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

#glassfish_jp +BWB&&৽‫ػ‬ೳղઆ #FBO7BMJEBUJPOฤ ‫ ג‬ΧαϨΞϧଟాਅහ (MBTT'JTI6TFS(SPVQ+BQBOษ‫ڧ‬ձ ೥݄೔ (C) CASAREAL, Inc. All rights reserved. 1

2.

#glassfish_jp ͜ͷηογϣϯʹ͍ͭͯ ▸ #FBO7BMJEBUJPOͷ৽‫ػ‬ೳΛղઆ͠·͢ ▸ ʲத‫͚޲ऀڃ‬ʳ#FBO7BMJEBUJPOΛ࢖ͬͨ͜ͱ͕ ͋Δํ͕ର৅Ͱ͢ ▸ αϯϓϧϓϩάϥϜ͸(JU)VCʹެ։͍ͯ͠·͢ ▸ IUUQTHJUIVCDPN.BTBUPTIJ5BEBCFBO WBMJEBUJPOTBNQMF 2 (C) CASAREAL, Inc. All rights reserved.

3.

#glassfish_jp ࣗ‫঺ݾ‬հ ▸ ଟాਅහʢ!TVLF@NBTBʣ ▸ ‫ݚ‬मτϨʔφʔ!ΧαϨΞϧ ▸ +BWB&&4QSJOH .JDSPTFSWJDFT$MPVE'PVOESZ ▸ 1JWPUBMೝఆߨࢣ ▸ (6(+ӡӦϝϯόʔɺ+46(ελοϑ 3 (C) CASAREAL, Inc. All rights reserved.

4.

#glassfish_jp ‫ࣜג‬ձࣾΧαϨΞϧ ▸ ଞࣾʹ͸ແ͍৭ʑͳϓϩάϥϛϯά‫ޠݴ‬ͷ‫ݚ‬म Λఏ‫͢·͍ͯ͠ڙ‬ʂ 4 (C) CASAREAL, Inc. All rights reserved.

5.

#glassfish_jp <$.>+BWB&&‫ݚ‬म΍ͬͯ·͢ ᶃ +BWB&&8FCΞϓϦέʔγϣϯ։ൃ ▸ +4' $%* +1"ͷ‫ૅج‬Λֶश ▸ IUUQTXXXDBTBSFBMDPKQMTTFSWJDFPQFOTFNJOBSKBWBQB ᶄ 3&458FCαʔϏε։ൃೖ໳ ▸ 3&45͓Αͼ+"934ͷ‫ૅج‬Λֶश ▸ IUUQTXXXDBTBSFBMDPKQMTTFSWJDFPQFOTFNJOBSKBWBQB ▸ $BTBSFBM💖1BZBSB 5 (C) CASAREAL, Inc. All rights reserved.

6.

#glassfish_jp ໨࣍ ᶃ #FBO7BMJEBUJPOͱ͸ʁ ᶄ #FBO7BMJEBUJPO֓ཁ ᶅ #7৽੍͍͠໿Ξϊςʔγϣϯ ᶆ #7‫ܕ‬Ҿ਺΁ͷ੍໿ࢦఆ ᶇ #7ͦͷଞ͍Ζ͍Ζ ᶈ +4'+4'Ͱͷ૬ؔόϦσʔγϣϯ 6 (C) CASAREAL, Inc. All rights reserved.

7.

#glassfish_jp ໨࣍ ᶃ #FBO7BMJEBUJPOͱ͸ʁ ᶄ #FBO7BMJEBUJPO֓ཁ ᶅ #7৽੍͍͠໿Ξϊςʔγϣϯ ᶆ #7‫ܕ‬Ҿ਺΁ͷ੍໿ࢦఆ ᶇ #7ͦͷଞ͍Ζ͍Ζ ᶈ +4'+4'Ͱͷ૬ؔόϦσʔγϣϯ 7 (C) CASAREAL, Inc. All rights reserved.

8.

#glassfish_jp #FBO7BMJEBUJPOͱ͸ʁ ▸ +BWB&&ͷҰ෦ͱͯ͠ఆٛ͞Εͨೖྗ‫ূݕ‬ͷ࢓༷ ▸ +BWB&&ʹ‫ݶ‬Βͣɺ༷ʑͳϑϨʔϜϫʔΫͷೖྗ ‫࢖Ͱূݕ‬ΘΕ͍ͯΔ ▸ 4QSJOHɺ(SBJMTɺ%SPQXJ[BSEɺʜ 8 (C) CASAREAL, Inc. All rights reserved.

9.

#glassfish_jp #FBO7BMJEBUJPO͸ʮ࢓༷ʯ ▸ #FBO7BMJEBUJPOͰܾ·ͬͯ ͍Δͷ͸࢓༷ॻɾΠϯλϑΣʔ εɾΞϊςʔγϣϯͳͲ ▸ ࢀর࣮૷͸ )JCFSOBUF7BMJEBUPS ࢓༷ #FBO7BMJEBUJPO ࣮૷ )JCFSOBUF7BMJEBUPS ▸ ‫Ͱ఺࣌ݱ‬͸།Ұͷ࣮૷ 9 (C) CASAREAL, Inc. All rights reserved.

10.

#glassfish_jp +"934Ͱͷར༻ྫ public class HelloDto { @NotBlank(message = "{hello.notblank}") private String message; // getter/setter } ΞϊςʔγϣϯΛ ෇͚Δ͚ͩʂ @Path("/hello") public class HelloResource { @POST public Response post(@Valid HelloDto helloDto) { // Կ͔ॲཧ } } 10 (C) CASAREAL, Inc. All rights reserved.

11.

#glassfish_jp Τϥʔϝοηʔδ ▸ TSDNBJOSFTPVSDFT 7BMJEBUJPO.FTTBHFTQSPQFSUJFTʹ‫ه‬ड़ hello.notblank = ϝοηʔδ͸ඞਢೖྗͰ͢ ▸ ଟ‫ޠݴ‬ରԠ΋Մೳ ▸ ͨͩ͠αʔόʔͷϩέʔϧʹͳΔ ValidationMessages_ja.properties hello.notblank = ϝοηʔδ͸ඞਢೖྗͰ͢ ValidationMessages_en.properties hello.notblank = Message is required (C) CASAREAL, Inc. All rights reserved. 11

12.
[beta]
#glassfish_jp

࣮ߦྫ
$ 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.

12

13.

#glassfish_jp ΋ͬͱৄ͘͠஌Γ͍ͨਓ͸ ▸ ʮύʔϑΣΫτ+BWB&&ʯΛಡΈ·͠ΐ͏ʂ Bean Validationͷষ͸ ٠ా͞Μ͕୲౰ʂ 13 (C) CASAREAL, Inc. All rights reserved.

14.

#glassfish_jp ໨࣍ ᶃ #FBO7BMJEBUJPOͱ͸ʁ ᶄ #FBO7BMJEBUJPO֓ཁ ᶅ #7৽͍͠‫ূݕ‬Ξϊςʔγϣϯ ᶆ #7‫ܕ‬Ҿ਺΁ͷ੍໿ࢦఆ ᶇ #7ͦͷଞ͍Ζ͍Ζ ᶈ +4'+4'Ͱͷ૬ؔόϦσʔγϣϯ 14 (C) CASAREAL, Inc. All rights reserved.

15.

#glassfish_jp #FBO7BMJEBUJPO֓ཁ ▸ +BWB&&ͷҰ෦ͱͯ͠೥݄ϦϦʔε👏 ▸ ରԠ͢Δ࣮૷͸)JCFSOBUF7BMJEBUPS 15 (C) CASAREAL, Inc. All rights reserved.

16.

#glassfish_jp #FBO7BMJEBUJPOͷ‫ج‬ຊํ਑ ᶃ ੍໿Ξϊςʔγϣϯͷ௥Ճ ▸ Ұ෦)JCFSOBUF7BMJEBUPSͷ΋ͷΛऔΓࠐΉ ᶄ +%,৽‫ػ‬ೳͷ‫༻׆‬ ▸ ‫ܕ‬Ξϊςʔγϣϯɺ൓෮ՄೳΞϊςʔγϣϯ ▸ %BUFBOE5JNF"1*ɺKBWBVUJM0QUJPOBM ▸ ϦϑϨΫγϣϯʹΑΔϝιουҾ਺໊ͷऔಘ ▸ ΠϯλϑΣʔεͷσϑΥϧτϝιου 16 (C) CASAREAL, Inc. All rights reserved.

17.

#glassfish_jp ໨࣍ ᶃ #FBO7BMJEBUJPOͱ͸ʁ ᶄ #FBO7BMJEBUJPO֓ཁ ᶅ #7৽੍͍͠໿Ξϊςʔγϣϯ ᶆ #7‫ܕ‬Ҿ਺΁ͷ੍໿ࢦఆ ᶇ #7ͦͷଞ͍Ζ͍Ζ ᶈ +4'+4'Ͱͷ૬ؔόϦσʔγϣϯ 17 (C) CASAREAL, Inc. All rights reserved.

18.

#glassfish_jp #7ͷશ੍໿Ξϊςʔγϣϯ ▸ @NotNull ▸ @Email ▸ @Negative ▸ @Null ▸ @Digits ▸ @NegativeOrZero ▸ @NotEmpty ▸ @DecimalMax ▸ @Past ▸ @NotBlank ▸ @DecimalMin ▸ @PastOrPresent ▸ @AssertTrue ▸ @Max ▸ @Future ▸ @AssertFalse ▸ @Min ▸ @Size ▸ @Positive ▸ @Pattern ▸ @PositiveOrZero ▸ @FutureOrPresent ※੺ଠࣈ͕৽Ξϊςʔγϣϯ 18 (C) CASAREAL, Inc. All rights reserved.

19.

#glassfish_jp ৽Ξϊςʔγϣϯղઆ  ໊લ ର৅ @NotBlank CharSequence @NotEmpty จࣈྻɺ഑ྻɺ ίϨΫγϣϯ આ໌ nullɺۭจࣈɺ ൒֯εϖʔε͸❌ nullɺ௕͞0͸❌ ϝʔϧΞυϨε‫ࣜܗ‬ @Email CharSequence @Positive ਺஋‫ܕ‬ ਖ਼ͷ਺஋Ͱͳ͍ͱ❌ @PositiveOrZero ਺஋‫ܕ‬ 0Ҏ্Ͱͳ͍ͱ❌ Ͱͳ͍ͱ❌ 19 (C) CASAREAL, Inc. All rights reserved.

20.

#glassfish_jp ৽Ξϊςʔγϣϯղઆ  ໊લ ର৅ આ໌ @Negative ਺஋‫ܕ‬ ෛͷ਺஋Ͱͳ͍ͱ❌ @NegativeOrZero ਺஋‫ܕ‬ 0ҎԼͰͳ͍ͱ❌ @PastOrPresent DateɺCalendarɺ java.time.* ա‫ͨ·ڈ‬͸‫ͱࡏݱ‬ @FutureOrPresent DateɺCalendarɺ java.time.* ಉ͡೔࣌Ͱͳ͍ͱ❌ ະདྷ·ͨ͸‫ͱࡏݱ‬ ಉ͡೔࣌Ͱͳ͍ͱ❌ 20 (C) CASAREAL, Inc. All rights reserved.

21.

#glassfish_jp ‫ػ৽͍͠خ‬ೳ ▸ @NotBlankɺ@NotEmptyɺ@Email͕ඪ४ʹ👏 ▸ ‫ݩ‬ʑ͸)JCFSOBUF7BMJEBUPSͷಠࣗΞϊςʔγϣϯ ʢ͜ΕΒ͸ඇਪ঑ʹͳͬͨʣ ▸ %BUFBOE5JNF"1*ʹ΋ࢦఆՄೳʹ👏 ▸ @Pastɺ@PastOrPresentɺ@Futureɺ @FutureOrPresent 21 (C) CASAREAL, Inc. All rights reserved.

22.

#glassfish_jp <ࢀߟ>)JCFSOBUF7BMJEBUPSಠࣗ‫ػ‬ೳ ▸ @PastͳͲͷ೔੍࣌໿ ˠ+PEB5JNFͷΫϥεʹ΋ద༻Մೳ👏 ▸ @Max/@PositiveͳͲͷ਺஋੍໿ ˠจࣈྻ΍javax.money.MonetaryAmountʹ΋ద༻ Մೳ👏 ▸ )JCFSOBUF7BMJEBUPS͕།Ұͷ࣮૷ͳͷͰɺ ಠࣗ‫ػ‬ೳͷ‫༻׆‬ʢʹϩοΫΠϯʣ΋ΞϦʁ 22 (C) CASAREAL, Inc. All rights reserved.

23.

#glassfish_jp ໨࣍ ᶃ #FBO7BMJEBUJPOͱ͸ʁ ᶄ #FBO7BMJEBUJPO֓ཁ ᶅ #7৽੍͍͠໿Ξϊςʔγϣϯ ᶆ #7‫ܕ‬Ҿ਺΁ͷ੍໿ࢦఆ ᶇ #7ͦͷଞ͍Ζ͍Ζ ᶈ +4'+4'Ͱͷ૬ؔόϦσʔγϣϯ 23 (C) CASAREAL, Inc. All rights reserved.

24.
[beta]
#glassfish_jp

‫ܕ‬Ҿ਺΁ͷ੍໿ࢦఆ
▸ δΣωϦΫεͷ‫ܕ‬Ҿ਺ʹ੍໿ࢦఆ͕Մೳʹ👏
▸ ίϨΫγϣϯͷத਎ͳͲ΁ͷ‫͕ূݕ‬Մೳʂ
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.

24

25.

#glassfish_jp ೖΕ෺Ϋϥε΁ͷ੍໿ࢦఆ ▸ OptionalXxxʢjava.util.OptionalInt౳ʣɺ +BWB'9ͷXxxPropertyʢIntegerProperty౳ʣ ʹ΋੍໿ࢦఆ͕Մೳʹ👏 public class Sample { @Max(10) private OptionalInt optionalInt; } // omitted 25 (C) CASAREAL, Inc. All rights reserved.

26.
[beta]
#glassfish_jp

࣮ߦ
@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());
}
26
(C) CASAREAL, Inc. All rights reserved.

27.
[beta]
#glassfish_jp

ίϨΫγϣϯ಺ʹෳ਺ͷҧ൓͕͋ͬͨΒʁ
▸ ҧ൓ͨ͠ཁૉͷ਺੍͚ͩ໿ҧ൓͕ग़Δ
@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());
}

27
(C) CASAREAL, Inc. All rights reserved.

28.

#glassfish_jp ໨࣍ ᶃ #FBO7BMJEBUJPOͱ͸ʁ ᶄ #FBO7BMJEBUJPO֓ཁ ᶅ #7৽੍͍͠໿Ξϊςʔγϣϯ ᶆ #7‫ܕ‬Ҿ਺΁ͷ੍໿ࢦఆ ᶇ #7ͦͷଞ͍Ζ͍Ζ ᶈ +4'+4'Ͱͷ૬ؔόϦσʔγϣϯ 28 (C) CASAREAL, Inc. All rights reserved.

29.

#glassfish_jp ͦͷଞ͍Ζ͍Ζ ▸ ੍໿Ξϊςʔγϣϯ͕൓෮Մೳʹͳͬͨ ▸ @Xxx.Listͷࢦఆ͕ෆཁʹ👏 ʙ#7Y @Max.List({ @Max(value = 100, groups = Group1.class), @Max(value = 200, groups = Group2.class) }) int someValue; #7ʙ @Max(value = 100, groups = Group1.class) @Max(value = 200, groups = Group2.class) int someValue; 29 (C) CASAREAL, Inc. All rights reserved.

30.

#glassfish_jp ͦͷଞ͍Ζ͍Ζ ▸ ϝιου΍ίϯετϥΫλͷҾ਺ʹରͯ͠όϦ σʔγϣϯͨ͠ࡍɺParameterNameProviderͰ Ҿ਺໊ΛऔಘͰ͖ΔΑ͏ʹͳͬͨ👏 ▸ ίϯύΠϧ࣌ʹ-parametersΦϓγϣϯ͕ඞཁ 30 (C) CASAREAL, Inc. All rights reserved.

31.

#glassfish_jp ͦͷଞ͍Ζ͍Ζ ▸ ConstraintValidatorΠϯλϑΣʔεͷ initialize()ϝιου͕ۭͷσϑΥϧτϝιο υʹͳͬͨ ▸ .&5"*/'WBMJEBUJPOYNMͷ9.-໊લۭ͕ؒม ߋ͞Εͨ 31 (C) CASAREAL, Inc. All rights reserved.

32.

#glassfish_jp ໨࣍ ᶃ #FBO7BMJEBUJPOͱ͸ʁ ᶄ #FBO7BMJEBUJPO֓ཁ ᶅ #7৽੍͍͠໿Ξϊςʔγϣϯ ᶆ #7‫ܕ‬Ҿ਺΁ͷ੍໿ࢦఆ ᶇ #7ͦͷଞ͍Ζ͍Ζ ᶈ +4'+4'Ͱͷ૬ؔόϦσʔγϣϯ 32 (C) CASAREAL, Inc. All rights reserved.

33.

#glassfish_jp +4'ͷ૬ؔόϦσʔγϣϯ ▸ ෳ਺߲໨Λൺֱͨ͠όϦσʔγϣϯ͕ग़དྷΔΑ ͏ʹͳͬͨ👏 33 (C) CASAREAL, Inc. All rights reserved.

34.

#glassfish_jp खॱᶃXFCYNMͷઃఆ <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> 34 (C) CASAREAL, Inc. All rights reserved.

35.
[beta]
#glassfish_jp

खॱᶄ੍໿Ξϊςʔγϣϯͷ࡞੒
@Constraint(validatedBy = EqualsValidator.class)
public @interface Equals {
String property1(); // ൺֱର৅ͷ1ͭ໨ͷϓϩύςΟ໊
String property2(); // ൺֱର৅ͷ2ͭ໨ͷϓϩύςΟ໊
public class EqualsValidator
implements ConstraintValidator<Equals, Object> {
@Override
public boolean isValid(Object obj,
ConstraintValidatorContext context) {
// ࢦఆ͞Εͨ2ͭͷϓϩύςΟͷ஋Λऔಘͯ͠ɺ
// ಉ͡஋ͩͬͨΒtrueΛฦ͢ॲཧΛॻ͘
}
35
(C) CASAREAL, Inc. All rights reserved.

36.

#glassfish_jp खॱᶅ.BOBHFE#FBOʹΞϊςʔτ @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 36 (C) CASAREAL, Inc. All rights reserved.

37.
[beta]
#glassfish_jp

खॱᶆ'BDFMFUTʹλάΛ‫ه‬ड़
<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ଐੑͰόϦσʔγϣϯάϧʔϓΛࢦఆՄೳ

37
(C) CASAREAL, Inc. All rights reserved.

38.

#glassfish_jp ஫ҙ఺ ▸ ‫ݸ‬ผϓϩύςΟͷ‫ূݕ‬ ˠΫϥεϨϕϧόϦσʔγϣϯ ͷॱʹ࣮ߦ͞ΕΔ ▸ ‫ݸ‬ผͷϓϩύςΟͰ੍໿ҧ൓͕͋ͬͨΒɺ ΫϥεϨϕϧόϦσʔγϣϯ͸࣮ߦ͞Εͳ͍ʂ 38 (C) CASAREAL, Inc. All rights reserved.

39.
[beta]
#glassfish_jp

஫ҙ఺
▸ <f:validateWholeBean>͸ɺ
ඞͣGPSN಺ͷҰ൪Լʹॻ͘ʂ
▸ ͦ͏Ͱͳ͍ͱྫ֎ൃੜ

Ұ൪Լʂʂ

<h:form id="email-form">
ϝʔϧΞυϨεɿ<h:inputText value=“…”/><br/>
ϝʔϧΞυϨεʢ֬ೝʣɿ<h:inputText value=“…”/><br/>
<h:commandButton value=“ૹ৴" action=“…”/>
<f:validateWholeBean value="#{compareBean}"/>
</h:form>
※ਖ਼֬ʹ‫ͱ͏ݴ‬ʮίϯϙʔωϯτπϦʔͷҰ൪ԼʯͳͷͰɺh:commandButtonΑΓ͸্Ͱ΋ྑ͍
(C) CASAREAL, Inc. All rights reserved.

39

40.

#glassfish_jp ·ͱΊ (C) CASAREAL, Inc. All rights reserved. 40

41.

#glassfish_jp ·ͱΊ  ▸ ศརͳ੍໿Ξϊςʔγϣϯ͕ಋೖ͞Εͨʂ ▸ @NotBlankɺ@NotEmptyɺ@Emailɺɾɾɾ ▸ ίϨΫγϣϯ΍OptionalͳͲͷཁૉ΁ͷ੍໿ࢦ ఆ͕Մೳʹʂ ▸ ੍໿ͷ‫ܕ‬ΞϊςʔγϣϯԽ 41 (C) CASAREAL, Inc. All rights reserved.

42.

#glassfish_jp ·ͱΊ  ▸ +%,ʹରԠʂ ▸ %BUFBOE5JNF"1*ɺ൓෮ՄೳΞϊςʔγϣϯɾɾɾ ▸ +4'Ͱ૬ؔόϦσʔγϣϯ͕ग़དྷΔΑ͏ʹʂ ▸ ΫϥεϨϕϧόϦσʔγϣϯ 42 (C) CASAREAL, Inc. All rights reserved.

43.

#glassfish_jp ‫ݸ‬ਓతͳ‫ײ‬૝ ▸ ৭ʑͱศརͳ‫ػ‬ೳ͕ೖͬͯ͏Ε͍͠😆 ▸ ໘౗ͩͬͨ+4'ͷ૬ؔόϦσʔγϣϯ͕ग़དྷΔͷ ΋͏Ε͍͠😆 ▸ +"934ɺόϦσʔγϣϯάϧʔϓ͸·ͩαϙʔ τ֎Β͍͠😭 43 (C) CASAREAL, Inc. All rights reserved.

44.

#glassfish_jp ࢀߟࢿྉ ▸ #FBO7BMJEBUJPOTQFDJpDBUJPO +43  ▸ IUUQCFBOWBMJEBUJPOPSHTQFD ▸ )JCFSOBUF7BMJEBUPS3FGFSFODF(VJEF ▸ IUUQTEPDTKCPTTPSHIJCFSOBUFTUBCMFWBMJEBUPSSFGFSFODFFO64 IUNM@TJOHMF ▸ +BWB4FSWFS'BDFT4QFDJpDBUJPOWFSTJPO +43  ▸ IUUQTKDQPSHBCPVU+BWBDPNNVOJUZQSPDFTTpOBMKTSJOEFYIUNM ▸ "OHIFM-FPOBSE͞Μͷ+4'αϯϓϧίʔυ ▸ IUUQTHJUIVCDPN"OHIFM-FPOBSE+4'USFFNBTUFS +4'7BMJEBUF8IPMF#FBO&YBNQMF 44 (C) CASAREAL, Inc. All rights reserved.

45.

#glassfish_jp &OKPZ:PVS7BMJEBUJPO-JGF ▸ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ 45 (C) CASAREAL, Inc. All rights reserved.