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
130
Isolating-the-domainの紹介
haljik
3
1.8k
普段使いのDDD
haljik
21
9.4k
ドメイン駆動設計を軽快に実践するための工夫
haljik
22
7.7k
Other Decks in Programming
See All in Programming
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
190
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
120
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
410
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
280
Contextとはなにか
chiroruxx
1
370
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
260
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
260
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
560
ふつうのFeature Flag実践入門
irof
8
4.2k
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.4k
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
190
Featured
See All Featured
Optimizing for Happiness
mojombo
378
71k
What's in a price? How to price your products and services
michaelherold
247
13k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
210
Paper Plane (Part 1)
katiecoart
PRO
0
9.2k
Automating Front-end Workflow
addyosmani
1370
210k
30 Presentation Tips
portentint
PRO
1
330
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
850
New Earth Scene 8
popppiees
3
2.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Exploring anti-patterns in Rails
aemeredith
3
430
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
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
͋ͨΓΛಡΉͱ͍Ζ͍ΖΘ͔Γ·͢
͍Ζ͍Ζ͑ͦ͏ͳςΫχοΫ͋ Δ͚Ͳɺը໘ʮਫʯͳͷͰɺԿ ͔ಠࣗͷ෦Λ࡞ΓࠐΜͰ͏Α͏ ͳࣄΛؤுͬͯඅ༻ରޮՌബ͍ ༗ΓΛૉʹ͏͜ͱ͕େࣄ