Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
実録Spring MVC
Search
haljik
March 26, 2017
Programming
5k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
実録Spring MVC
https://kanjava.connpass.com/event/51501/
#kanjava
haljik
March 26, 2017
More Decks by haljik
See All by haljik
develop-with-domain-expert
haljik
1
1.2k
ドメイン駆動設計の紹介
haljik
0
140
Isolating-the-domainの紹介
haljik
3
1.8k
普段使いのDDD
haljik
21
9.5k
ドメイン駆動設計を軽快に実践するための工夫
haljik
22
7.7k
Other Decks in Programming
See All in Programming
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
200
FDEとは、何者なのか?
masapyon1212
0
140
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
0
210
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
140
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
140
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
440
バグを直したら useEffect が消えた
colorful12
3
830
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
2
300
不幸な GC
chencmd
0
870
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
170
業務時間外もAIに働いてもらう話
colorful12
3
9.9k
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
120
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
510
Paper Plane (Part 1)
katiecoart
PRO
1
10k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
370
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
430
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Evolving SEO for Evolving Search Engines
ryanjones
0
280
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
The SEO identity crisis: Don't let AI make you average
varn
0
550
A Modern Web Designer's Workflow
chriscoyier
698
190k
Transcript
࣮4QSJOH.7$ ࣮ΞϓϦέʔγϣϯͰͷ՝ͱͦͷղফํ๏
ࣗݾհ w Տ্ɹ࢘ʢ͔Θ͔Έ͍ͤ͡ʣ w 5XJUUFS!IBMKJL w ؔ%%%KBWBओ࠵%%%"MMJBODFൃىਓϝϯόʔ w +BWB%%%4DBMBFUDʜ w
ϑϦʔϥϯεϓϩάϥϚʔ
લఏ w 4QSJOH.7$3&-&"4& 4QSJOH#PPU3&-&"4& w 5IZNFMFBG3&-&"4& w 41"Ͱͳ͍ݹདྷ͔Βͷ8FCΞϓϦέʔγϣϯ 41"Ͱ͑Δ෦ͳ͘ͳ͍ʣ
w εϥΠυʹग़ͯ͘ΔίʔυJNQPSU%*෦ͳ Ͳղઆʹඞཁͷͳ͍෦Λলུ
ࠓ͢͜ͱ ࢲͷʮ4QSJOH.7$ͷ͍ํʯͱʮͦΕͧΕརͱܽʯ w ը໘͔ΒͷೖྗΛड͚औΔओཁͳํ๏ w ೖྗͷόΠϯυΛΧελϚΠζ͢Δํ๏ w ίϯτϩʔϥͷ࣮୯Ґ w ঢ়ଶͷ࣋ͪճΓํ๏͋Ε͜Ε
w ͦͷଞɺ͍ͬͯΔͱ͔ͤ͠Εͳ͍͜ͱ
ը໘͔ΒͷೖྗΛड͚औΔओཁͳํ๏ w !3FRVFTU1BSBN ओʹ(&5ͷ࣌ͷ͔̍ͭ͠ͳ͍Α͏ͳΫΤϦʔύϥϝʔ λΛड͚औΔ࣌ w !1BUI7BSJBCMF 63-ʹؚ·ΕΔࣝผࢠΛड͚औΔ࣌ w !.PEFM"UUSJCVUF
ൺֱతେ͖ͳϑΥʔϜ͔ΒͷෳࡶͳೖྗΛड͚औΔ࣌
ը໘͔ΒͷೖྗΛड͚औΔओཁͳํ๏ !3FRVFTU1BSBN @Controller @RequestMapping("/employees") public class EmployeeListController { //
ex. http://localhost:8080/employees?name=haljik @GetMapping public String showList(@RequestParam("name") Name name, Model model) { model.addAttribute("employees", service.listOf(name)); return "employees"; } }
ը໘͔ΒͷೖྗΛड͚औΔओཁͳํ๏ !1BUI7BSJBCMF @Controller @RequestMapping("/employees/{number}") public class EmployeeController { //
ex. http://localhost:8080/employees/0001 @GetMapping public String showDetail( @PathVariable("number") EmployeeNumber number, Model model ) { model.addAttribute("employee", service.employeeOf(number)); return "employee-detail"; } }
ը໘͔ΒͷೖྗΛड͚औΔओཁͳํ๏ !.PEFM"UUSJCVUF @Controller @RequestMapping("/employees/registration") public class EmployeeRegistrationController { @ModelAttribute("employee")
Employee employee() { return service.prototype(); } @GetMapping public String show() { return "employee-registration"; } @PostMapping public String register( @Valid @ModelAttribute("employee") Employee employee, BindingResult bindingResult ) { if (bindingResult.hasErrors()) return show(); Employee registered = service.register(employee); return String.format("redirect:/employees/%s", registered.number()); } } ᶃ ᶄ ᶆ ᶅ (&5ᶃᶄ 1045ᶅᶆ ᶅͱᶆͷؒͰ1PTUσʔλ͕ &NQMPZFFʹόΠϯυ͞ΕΔ !.PEFM"UUSJCVUF͖ͷϝιου͕ฦ͢ ΦϒδΣΫτ͕.PEFMͷଐੑͱͯ͠ηο τ͞Εͯɺ)5.-ςϯϓϨʔτ͔Βࢀর ՄೳʹͳΔ 5*14ϦΫΤετCJOEͨ͘͠ͳ͍͚Ͳड͚औΓ͍ͨ.PEFM"UUSJCVUFCJOEJOHGBMTFΛࢦఆ͢Δ
ը໘͔ΒͷೖྗΛड͚औΔओཁͳํ๏ !.PEFM"UUSJCVUF w 1SPT w ෳࡶͳΦϒδΣΫτΛΈ্ཱͯͨͰϦΫΤετΛόΠϯυ Մೳ FYόϦσʔγϣϯʹඞཁͳσʔλͳͲऔಘͯ͠อ࣋ ͓͚ͯ͠Δʣ w
$POT w ίϯτϩʔϥͷ࣮୯Ґʹ੍͕ൃੜ͢Δ !.PEFM"UUSJCVUF͕͍ͨϝιουͦͷίϯτϩʔϥͷ ϦΫΤετ͝ͱʹৗʹʹ࣮ߦ͞ΕΔ ˞ઃܭΫϦʔϯʹͳΔͷͰΉ͠ΖϝϦοτ
ิ7BMVF0CKFDUͰͷडऔ public class Name { @NotEmpty(message = "ࢯ໊ೖྗ͍ͯͩ͘͠͞") @Length(max =
30, message = "ࢯ໊30จࣈ·ͰͰೖྗ͍ͯͩ͘͠͞") String value = ""; public Name(String value) { this.value = value; } @Override public String toString() { return value; } } 4QSJOH.7$3FRVFTU1BSBN1BUI7BSJBCMF.PEFM"UUSJCVUFશͯͷ߹Ͱɺ 4JOHMF4USJOH$POTUSVDUPS ͕͋Εͬͯ͘ΕΔ $POT w UIZNFMFBGͷUIpFMEͱόΠϯυ͢ΔʹUP4USJOHͰWBMVFͦͷͷΛฦ࣮͕͢ ඞཁʹͳΔ
ʮը໘͔ΒͷೖྗΛड͚औΔ ओཁͳํ๏ʯ ͜͜·Ͱ
ೖྗͷόΠϯυΛΧελϚΠζ͢Δ %JSFDU'JFME"DDFTTͰHFUUFS TFUUFSͷແ͍ੈք
ೖྗͷόΠϯυΛΧελϚΠζ͢Δ %JSFDU'JFME"DDFTT @ControllerAdvice(basePackages =“com.example.presentation”) public class DirectFieldAccessAdvice { @InitBinder public
void initBinder(WebDataBinder binder) { binder.initDirectFieldAccess(); binder.setAllowedFields("to be specified"); } } ᶃ lDPNFYBNQMFQSFTFOUBUJPOzύοέʔδʹ͋Δશ$POUSPMMFSʹద༻͢Δ "EWJDFͷதͰɺೖྗΛΦϒδΣΫτʹόΠϯυ͢ΔࡍɺTFUUFSΛܦ༝ͤͣ ϑΟʔϧυʹηοτ͢ΔΑ͏ʹઃఆ ᶄ ҙਤ͠ͳ͍ϑΟʔϧυͷվ᜵Λ͙ͨΊແޮͳΛઃఆ͠ɺͦΕͧΕͷί ϯτϩʔϥͰݸผʹઃఆΛ্ॻ͖͢Δ ᶃ ᶄ
ೖྗͷόΠϯυΛΧελϚΠζ͢Δ %JSFDU'JFME"DDFTT @InitBinder void initBinder(WebDataBinder binder) { binder.setAllowedFields("mailAddress", "name"); }
public class Employee { EmployeeNumber number; MailAddress mailAddress; Name name; public EmployeeNumber number() { return number; } } 1045NBJM"EESFTTlYYY!FYBNQMFDPNzOBNFlTFJKJLBXBLBNJz ίϯτϩʔϥͰڐՄ͢ΔϑΟʔϧυΛઃఆ CJOE
ೖྗͷόΠϯυΛΧελϚΠζ͢Δ %JSFDU'JFME"DDFTT w 1SPT w HFUUFSTFUUFSΛແͤͯ͘ϞσϧͷϊΠζ͕ݮΔ w όΠϯυ͢ΔϑΟʔϧυ͕ίϯτϩʔϥຖʹ໌֬Ͱҙਤ͠ͳ͍վ᜵ʹ ରͯ҆͠શ w
$POT w ίϯτϩʔϥຖʹڐՄ͢ΔϑΟʔϧυΛઃఆ͢Δඞཁ͕͋Δ w #FBO7BMJEBUJPOͱͷ૬ੑʹ ޙड़ هਖ਼֬ʹ4QSJOH.7$্Ͱ#FBO7BMJEBUJPOͱ5IZNFMFBGΛΈ߹ Θͤͨ࣌ʹ͕͋Δɻ#FBO7BMJEBUJPO୯ମͰ͕ͳ͍ɻ
ೖྗͷόΠϯυΛΧελϚΠζ͢Δ %JSFDU'JFME"DDFTT #FBO7BMJEBUJPOͱͷ૬ੑ هɿ4QSJOH.7$্Ͱ5IZNFMFBGͱ#FBO7BMJEBUJPO ΛΈ߹Θͤͨ࣌ʹग़Δʣ ૬ؔνΣοΫͳͲΛϝιουͰ࣮ͯ͠!"TTFSU5SVFΑ͘Δ͕ɺԿނ͔ϝ ιουʹରԠ͢ΔϑΟʔϧυ͕ඞཁʹͳͬͯ͠·͏ boolean valid; @AssertTrue
public boolean isValid() { return ͳΜΒ͔ͷνΣοΫ } ͜Ε͕ͳ͍ͱΤϥʔ
ʮ%JSFDU'JFME"DDFTT ͰHFUUFSTFUUFSͷແ͍ ੈքʯ ͜͜·Ͱ
ίϯτϩʔϥͷ࣮୯Ґ w Ұ࿈ͷૢ࡞ϑϩʔ୯Ґ w Ϧιʔε୯Ґ FYࣾһͳͲ͋ΔΦϒδΣΫτʹର͢Δ$36%Ұࣜ w )5.-ςϯϓϨʔτ୯Ґ ը໘୯Ґͱݴ͏
ίϯτϩʔϥͷ࣮୯Ґ Ұ࿈ͷૢ࡞ϑϩʔ୯Ґ ʮΟβʔυͷΑ͏ͳ༷ʑͳΓιʔεʹ·͕ͨΔૢ࡞͚ͩͲҰ ࿈ͷϑϩʔͰ͋Δૢ࡞ʯ͜ΕΛҰͭͷίϯτϩʔϥͰΔͷ Ξϯνύλʔϯ w ΠϯδΣΫγϣϯ͞ΕΔαʔϏεͷ͕૿͑ɺίϯτϩʔϥ ͕ଠΔ w %JSFDU'JFME"DDFTTʹؔ࿈ͯ͠!*OJU#JOEFSͰͷBMMPX'JFMET
ࢦఆ͕ΒΈɺಉ໊͡લͰʮ͋ΔΦϒδΣΫτͰڐՄɺ ผͷΦϒδΣΫτͰڐՄͨ͘͠ͳ͍ʯͳͲໃ६͢ΔՄೳੑ ग़ͯ͘Δ
ίϯτϩʔϥͷ࣮୯Ґ Ϧιʔε୯Ґ ಠཱͨ͠Ϛελͷ$36%ͳͲཁ͕݅୯७ͳ߹ʹݶͬͯ༗Γ $36%͝ͱʹҧ͏ଞͷϦιʔεΛࢀߟใͱͯ͠දࣔͨ͠Γ͢Δɺ͠ ͘কདྷతʹͦ͏ͳΓͦ͏ͳΒޙड़ͷ)5.-ςϯϓϨʔτ୯Ґ͕ྑ͍ 1SPT w 1BUI7BSJBCMFͰͷϦιʔεࢦఆͳΒɺ63-ͷڞ༗Λߟ͑ͳͯ͘ྑ͍ w ѻ͏Ϧιʔεಉ͡ͳͷͰ!.PEFM"UUSJCVUFͷએݴڞ༗͍͢͠
$POT w $36%ͷͲΕ͔ҰͭͰෳࡶͳཁ͕݅͋Δ߹ίϯτϩʔϥ͕ଠ Δ
ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ ͍ΘΏΔը໘୯Ґͷίϯτϩʔϥ࣮ جຊతʹ͜ΕΛબ͢Δ͜ͱ͕ଟ͍ ߹ʹΑͬͯ͞Βʹࡉ͔͍ΦϖϨʔγϣϯ୯Ґʹͳ Δ͜ͱ͋Δ
ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ ྫࣾһͷ$36%ͷ߹
ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ ྫࣾһͷ$36%ͷ߹ొ @Controller @RequestMapping("/employees/registration") public class EmployeeRegistrationController { @ModelAttribute("employee")
Employee employee() { return service.prototype(); } @GetMapping public String show() { return "employee-registration"; } @PostMapping public String register(@Valid @ModelAttribute("employee") Employee employee, BindingResult bindingResult) { if (bindingResult.hasErrors()) return show(); Employee registered = service.register(employee); return String.format("redirect:/employees/%s", registered.number()); } @InitBinder void initBinder(WebDataBinder binder) { binder.setAllowedFields("mailAddress", "name"); } }
ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ ྫࣾһͷ$36%ͷ߹ @Controller @RequestMapping("/employees/{number}") public class EmployeeController {
@ModelAttribute("employee") public Employee employeeOf(@PathVariable("number") EmployeeNumber number) { return service.employeeOf(number); } @GetMapping public String show() { return "employee-detail"; } }
ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ ྫࣾһͷ$36%ͷ߹ฤू @Controller @RequestMapping("/employees/{number}/edit") public class EmployeeEditController { @ModelAttribute("employee")
public Employee employeeOf(@PathVariable("number") EmployeeNumber number) { return service.employeeOf(number); } @GetMapping public String show() { return "employee-edit"; } @PostMapping public String modify(@Valid @ModelAttribute("employee") Employee employee, BindingResult bindingResult) { if (bindingResult.hasErrors()) return show(); service.modify(employee); return String.format(“redirect:/employees/%s", employee.number()); } @InitBinder void initBinder(WebDataBinder binder) { binder.setAllowedFields("mailAddress", "name"); } }
ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ ྫࣾһͷ$36%ͷ߹ @Controller @RequestMapping("/employees/{number}/delete") public class EmployeeEditController { @ModelAttribute("employee")
public Employee employeeOf(@PathVariable("number") EmployeeNumber number) { return service.employeeOf(number); } @GetMapping public String show() { return "employee-delete"; } @PostMapping public String delete( @ModelAttribute(“employee”) Employee employee ) { if (bindingResult.hasErrors()) return show(); service.delete(employee); return String.format(“redirect:/employees/%s", employee.number()); } }
ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ 1SPT w ͋Δը໘ͷ࣋ͭػೳʹूதͰ͖Δ w !.PEFM"UUSJCVUFʹΑΔσʔλόΠϯσΟϯάͱ૬ੑ͕ྑ͍ w %JSFDU'JFME"DDFTTͱ૬ੑ͕ྑ͍ $POT
w ୯ҰͷϦιʔεʹର͢ΔΦϖϨʔγϣϯׂ͕͞ΕΔͷͰɺ1BUI7BSJBCMFͰϦιʔ εΛදݱ͍ͯ͠Δ߹ಉ͡63-Λෳίϯτϩʔϥʹهड़͢Δ͜ͱʹͳΔ͕ɺΞϊ ςʔγϣϯʹࢦఆ͢Δจࣈྻ੩తͰ͋Δඞཁ͕͋ͬͯɺTUBUJDͷจࣈྻఆఆٛ ͱจࣈྻ࿈͔݁͠ํ๏͕ͳ͍ w ಉ͡!.PEFM"UUSJCVUFએݴ͕ෳͷίϯτϩʔϥʔʹࢄΒΓ͕ͪ
QSFTFOUBUJPO ᵓᴷᴷ%JSFDU'JFME"DDFTT"EWJDFKBWB ᵓᴷᴷ1SPQFSUZ&EJUPS"EWJDFKBWB ᵋᴷᴷFNQMPZFF ᵓᴷᴷ&NQMPZFF-JTU$POUSPMMFSKBWB ᵓᴷᴷ&NQMPZFF3FHJTUSBUJPO$POUSPMMFSKBWB ᵋᴷᴷEFUBJM ᵓᴷᴷ&NQMPZFF"EWJDFKBWB ᵓᴷᴷ&NQMPZFF$POUSPMMFSKBWB ᵓᴷᴷ&NQMPZFF%FMFUF$POUSPMMFSKBWB
ᵋᴷᴷ&NQMPZFF&EJU$POUSPMMFSKBWB ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ $POTͷ!.PEFM"UUSJCVUFͷॏෳΛ!$POUSPMMFS"EWJDFͰҰݩԽ͢Δ !.PEFM"UUSJCVUF͕ ॏෳ͍ͯ͠Δ $POUSPMMFSಉҰύο έʔδʹ·ͱ·͍ͬͯ Δ
ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ $POTͷ!.PEFM"UUSJCVUFͷॏෳΛ!$POUSPMMFS"EWJDFͰҰݩԽ͢Δ @ControllerAdvice(basePackageClasses = EmployeeAdvice.class) public class EmployeeAdvice {
public static final String BASE_URL="/employees/{number}"; public static final String EMPLOYEE="employee"; @ModelAttribute(EMPLOYEE) Employee employeeOf(@PathVariable("number")EmployeeNumber employeeNumber) { return service.employeeOf(employeeNumber); } EmployeeService service; public EmployeeAdvice(EmployeeService service) { this.service = service; } } $POUSPMMFS"EWJDF 1BUI7BSJBCMFͷΞΫηεҰݩԽͰ͖ͨͷͰ #"4&@63-Λఆͱͯ͠1BUI7BSJBCMFΛ͜ͷ"EWJDFʹӅṭ͍ͯ͠Δ
ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ $POTͷ!.PEFM"UUSJCVUFͷॏෳΛ!$POUSPMMFS"EWJDFͰҰݩԽ͢Δ @Controller @RequestMapping(EmployeeAdvice.BASE_URL + "/edit") public class EmployeeEditController
{ @GetMapping public String show() { return "employee-edit"; } @PostMapping public String modify( @Valid @ModelAttribute(EmployeeAdvice.EMPLOYEE) Employee employee, BindingResult bindingResult ) { if (bindingResult.hasErrors()) return show(); service.modify(employee); return String.format(“redirect:/employees/%s", employee.number()); } @InitBinder void initBinder(WebDataBinder binder) { binder.setAllowedFields("mailAddress", "name"); } } ฤू จࣈྻఆͱจࣈྻ࿈݁ෆ͕֨ͩ ΓΑ͏͕ͳ͍ɻɻɻΞϊςʔγϣϯ ͷਏΈ
@Controller @RequestMapping(EmployeeAdvice.BASE_URL + "/delete") public class EmployeeDeleteController { @GetMapping public
String show() { return "employee-delete"; } @PostMapping public String delete( @ModelAttribute(EmployeeAdvice.EMPLOYEE) Employee employee ) { service.delete(employee); return "redirect:/employees"; } } ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ $POTͷ!.PEFM"UUSJCVUFͷॏෳΛ!$POUSPMMFS"EWJDFͰҰݩԽ͢Δ আ
@Controller @RequestMapping(EmployeeAdvice.BASE_URL) public class EmployeeController { @GetMapping public String showDetail()
{ return "employee-detail"; } } ίϯτϩʔϥͷ࣮୯Ґ )5.-ςϯϓϨʔτ୯Ґ $POTͷ!.PEFM"UUSJCVUFͷॏෳΛ!$POUSPMMFS"EWJDFͰҰݩԽ͢Δ ৄࡉ γϯϓϧʂ
!$POUSPMMFS"EWJDFͷ͍Ͳ ͜Ζ w !.PEFM"UUSJCVUFએݴͷҰݩԽ w 1BUI7BSJBCMFͷॲཧͷҰݩԽ ˞ࠓճղઆ͍ͯ͠·ͤΜ͕$POUSPMMFSͷྫ֎ॲཧΛҰݩԽͨ͠ΓͰ ͖·͢ɻ
ίϯτϩʔϥͷ࣮୯Ґ ʹ͍ͭͯ͜͜·Ͱ
ঢ়ଶͷ࣋ͪճΓํ๏ w Α͋͘Δཁ݅ w ݕࡧ݁ՌҰཡ͔Βৄࡉը໘Λ։͖ɺৄࡉը໘͔ΒҰཡʹ ͬͨ࣌ʹಉ݅͡ͰҰཡΛද͍ࣔͨ͠ ˣ Ұཡදࣔ࣌ͷݕࡧ݅Λ࣋ͪճΓ w ͲͷϥϯσΟϯάϖʔδ͔Βྲྀೖͨ͠จͳͷ͔ΛΓͨ
͍ ˣ ϥϯσΟϯάϖʔδͷࣝผࢠΛจը໘·Ͱ࣋ͪճΓ
ঢ়ଶͷ࣋ͪճΓํ๏ બࢶ w !4FTTJPO"UUSJCVUF )UUQ4FTTJPO w $PPLJF w %#ʹอଘ͠Ϧιʔεͱͯ͠*%Λൃߦ
ঢ়ଶͷ࣋ͪճΓํ๏ !4FTTJPO"UUSJCVUF 1SPT w ༰қͰ͋Δ $POT w ηογϣϯͷڞ༗͕ඞਢͱͳΓεέʔϧΞτ͠ʹ͍͘ w ֨ೲ͢ΔΦϒδΣΫτ4FSJBMJ[BCMFΛ࣮͢Δඞཁ͕͋
ΔʢճආͰ͖ͳ͍Θ͚Ͱͳ͍͕໘ʜʣ 4FTTJPO͏ͳΒ4QSJOH4FTTJPOͰ͓͙͙Γ͍ͩ͘͞
ঢ়ଶͷ࣋ͪճΓํ๏ $PPLJF 1SPT w ୯७ʹεέʔϧ͢Δ w 0CKFDU4FSJBMJ[FSʹཔΒͣɺ4FSJBMJ[BCMFͷ࣮ෆཁ $POT w αΠζ੍ݶ
ʙ, w վ᜵ʹऑ͍ ॺ໊ΛؚΊΔࣄͰճආՄೳ w 4FTTJPOͷΑ͏ͳखܰ͞ΛٻΊΔͱ࡞ΓࠐΈ͕গ͠ඞཁʹͳΔ ࠷ۙ+BDLTPOͰ+40/ʹมͯ͠63-Τϯίʔυͨ͠ͷΛ$PPLJFͱ͠ ͯൃߦ͢ΔΓํΛΜͰ͍ͬͯΔ
ঢ়ଶͷ࣋ͪճΓํ๏ %#ʹอଘ͠Ϧιʔεͱͯ͠*%Λൃߦ ঢ়ଶΛ%#ʹอଘͯ͠*%Λൃߦɻͦͷ*%Λ63- 1BUI7BSJBCMF Ͱ࣋ͪճΔ ࢀߟ3&45'VM8FCαʔϏεIUUQTXXXPSFJMMZDPKQCPPLT ͷʮτϥϯβΫγϣϯΛϦιʔεͱͯ͠ൃߦ͢Δʯͱ͍͏هड़͔ΒΞΠσΞΛഈआ 1SPT
w ར༻ऀ͕ɺ్தͰσόΠεΛ࣋ͪସ͑ͨ߹ʹ63-͑͞Θ͔Εঢ়ଶΛҾ͖ ܧ͛Δ $POT w 63-ʹอଘͨ͠ঢ়ଶͷ*%ΛຒΊࠐΉͷͰվ᜵ʹऑ͍ʢ+85ͱͯ͠ຒΊࠐΉͳ ͲͰճආՄೳʣ w खܰ͞ͳ͘ɺ࡞ΓࠐΈͷੈք
ঢ়ଶͷ࣋ͪճΓํ๏ ͜͜·Ͱ
ͦͷଞ͍ͬͯΔͱ͔ͤ ͠Εͳ͍͜ͱ w )BOEMFS.FUIPE"SHVNFOU3FTPMWFS ίϯςΩετʹґଘ͢ΔಠࣗΦϒδΣΫτΛҾͰड͚औΓͨ ͍ w 6SJ$PNQPOFOUT#VJMEFS͋Δ͍.WD6SJ$PNQPOFOUT#VJMEFS ϦμΠϨΫτ63-ΛίϯτϩʔϥͰ࡞Δͷָ͕
w ίϯτϩʔϥ͔Β5IZNFMFBGͷGSBHNFOUΛฦͤΔ ෦తʹಈతͳը໘Λ࡞Δͷʹ࠷ద w 3FTU"1*Ͱ%JSFDU'JFME"DDFTT ʢ0CKFDU.BQQFSͷઃఆʣ
)BOEMFS.FUIPE"SHVNFOU3FTPMWFS ϦΫΤετηογϣϯͳͲͷίϯςΩετʹґଘ͠ ͨಛघͳҾΛड͚औΓ͍ͨ߹ʹ͏ ࣮ྫɿϩάΠϯ͍ͯ͠ΔϢʔβʔΦϒδΣΫτΛҾ Ͱड͚औΓ͍ͨɺϩάΠϯ͍ͯ͠ͳ͍߹ྫ֎Ͱྑ ͍ͳͲ "1*ͱͯ͠ϑϨʔϜϫʔΫ࡞ऀ͖Ͱɺίϯτ ϩʔϥͷ࣮͚ࣝͩͰ࣮Ͱ͖ͳ͍ͷ͕
6SJ$PNQPOFOUT#VJMEFS͋Δ͍ .WD6SJ$PNQPOFOUT#VJMEFS 1BUI7BSJBCMFΛؚΉ63-ͷม෦Λల։ͯ͘͠ΕΔ ·ͨ҆શʹΫΤϦύϥϝʔλΛ༩Ͱ͖Δ ଞͷ"1*ݺͼग़͠Λߦ͏ࡍͷ63*ߏஙɺଞը໘ͷ ϦμΠϨΫτ63-ͷΈཱͯΛ҆શʹ͍ͨ࣌͠ʹ͏ TUBUJDͳϢʔςΟϦςΟʔʹ͍ۙͷͰ8SBQͯ͠ΞϓϦ έʔγϣϯίʔυ͔ΒґଘΊΔͳͲ͠ ͨ΄͏͕ྑ͍͔͠Εͳ͍
ίϯτϩʔϥ͔Β5IZNMFBG ͷGSBHNFOUΛฦͤΔ ը໘ͷҰ෦͚ͩಈతʹ͍ͨ͠ͱ͍͏߹ ᶃ )5.-ςϯϓϨʔτͷಈతʹ͍ͨ͠෦ʹUIGSBHNFOUͰ໊ લΛ͚Δ ᶄ ͦͷը໘Λද͍ࣔͯ͠Δίϯτϩʔϥʹͦͷ໊લΛΛฦ͢ϋ ϯυϥϝιουΛՃ ᶅ
BKBY௨৴Ͱ֘෦͚ͩΛऔಘͯ͠%0.Λஔ͖͑Δ ॳظදࣔͷϨϯμϦϯάͱɺը໘ͷΞΫγϣϯʹΑΔಈతͳ෦ ϨϯμϦϯάΛ΄΅΄΅ҰݩԽͰ͖Δ
3&45"1*Ͱ %JSFDU'JFME"DDFTT !3FTU$POUSPMMFSͰ+TPOϕʔεͷ3FTU"1*Λ࡞Δ࣌ Ͱ%JSFDU'JFME"DDFTTʹͯ͠HFUUFSTFUUFSΛແ͘ ͤ·͢ɻ@Configuration public class ObjectMapperConfig {
@Bean public ObjectMapper directFieldAccessObjectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.NON_PRIVATE); mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); mapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE); return mapper; } } 4QSJOH#PPUͳΒ͜ΕͰ
·ͱΊ HFUUFSTFUUFSΊΑ͏ ը໘୯Ґ͕ஸྑ͍
͓·͚ w Έ͕Γ͍ͨਓ͚ w 4QSJOH.7$ͷਆ%JTQBUDIFS4FSWMFUͳͷͰ͜ ͔͜ΒιʔεಡΊྑ͍ w ίϯτϩʔϥʹؔΘΔ෦͚ͩͩͱɺ 3FRVFTU.BQQJOH)BOEMFS.BQQJOH 3FRVFTU.BQQJOH)BOEMFS"EBQUFS
͋ͨΓΛಡΉͱ͍Ζ͍ΖΘ͔Γ·͢
͍Ζ͍Ζ͑ͦ͏ͳςΫχοΫ͋ Δ͚Ͳɺը໘ʮਫʯͳͷͰɺԿ ͔ಠࣗͷ෦Λ࡞ΓࠐΜͰ͏Α͏ ͳࣄΛؤுͬͯඅ༻ରޮՌബ͍ ༗ΓΛૉʹ͏͜ͱ͕େࣄ