Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
実録Spring MVC
haljik
March 26, 2017
Programming
10
4.3k
実録Spring MVC
https://kanjava.connpass.com/event/51501/
#kanjava
haljik
March 26, 2017
Tweet
Share
More Decks by haljik
See All by haljik
develop-with-domain-expert
haljik
1
860
ドメイン駆動設計の紹介
haljik
0
65
Isolating-the-domainの紹介
haljik
3
1.3k
普段使いのDDD
haljik
21
8.4k
ドメイン駆動設計を軽快に実践するための工夫
haljik
22
7.1k
Other Decks in Programming
See All in Programming
Amazon QuickSightのアップデート -re:Invent 2022の復習&2022年ハイライト-
shogo452
0
220
[2023년 1월 세미나] 데이터 분석가 되면 어떤 일을 하나요?
datarian
0
590
僕が考えた超最強のKMMアプリの作り方
spbaya0141
0
180
ポケモンで学ぶiOS 16弾丸ツアー 🚅
giginet
PRO
1
610
はてなリモートインターンシップ2022 Web API 講義資料
hatena
0
150
AWSとCPUのムフフな関係
cmdemura
0
460
Prácticas de Seguridad en Kubernetes
pablokbs
0
130
ECS Service Connectでマイクロサービスを繋いでみた
xblood
0
530
SHOWROOMの分析目的を意識した伝え方・コミュニケーション
hatapu
0
240
ipa-medit: Memory search and patch tool for IPA without Jailbreaking/ipa-medit-bh2022-europe
tkmru
0
130
和暦を正しく扱うための暦の話
nagise
10
6k
Hono v3 - Do Everything, Run Anywhere, But Small, And Faster
yusukebe
4
130
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1351
200k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
101
6.2k
What's in a price? How to price your products and services
michaelherold
233
9.7k
A designer walks into a library…
pauljervisheath
199
16k
Designing the Hi-DPI Web
ddemaree
273
32k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
13
1.1k
Into the Great Unknown - MozCon
thekraken
2
290
Rails Girls Zürich Keynote
gr2m
87
12k
Happy Clients
brianwarren
90
5.8k
How GitHub Uses GitHub to Build GitHub
holman
465
280k
Code Reviewing Like a Champion
maltzj
508
38k
VelocityConf: Rendering Performance Case Studies
addyosmani
317
22k
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
͋ͨΓΛಡΉͱ͍Ζ͍ΖΘ͔Γ·͢
͍Ζ͍Ζ͑ͦ͏ͳςΫχοΫ͋ Δ͚Ͳɺը໘ʮਫʯͳͷͰɺԿ ͔ಠࣗͷ෦Λ࡞ΓࠐΜͰ͏Α͏ ͳࣄΛؤுͬͯඅ༻ରޮՌബ͍ ༗ΓΛૉʹ͏͜ͱ͕େࣄ