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
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
430
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.5k
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
150
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
210
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
480
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
390
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
1
250
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.7k
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
220
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
220
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
190
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
180
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
55
8.3k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
430
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
260
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
310
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
360
A Soul's Torment
seathinner
6
3.4k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
780
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
͋ͨΓΛಡΉͱ͍Ζ͍ΖΘ͔Γ·͢
͍Ζ͍Ζ͑ͦ͏ͳςΫχοΫ͋ Δ͚Ͳɺը໘ʮਫʯͳͷͰɺԿ ͔ಠࣗͷ෦Λ࡞ΓࠐΜͰ͏Α͏ ͳࣄΛؤுͬͯඅ༻ରޮՌബ͍ ༗ΓΛૉʹ͏͜ͱ͕େࣄ