Speaker Deck
Speaker Deck Pro
Sign in
Sign up
for free
実録Spring MVC
haljik
March 26, 2017
Programming
10
3.7k
実録Spring MVC
https://kanjava.connpass.com/event/51501/
#kanjava
haljik
March 26, 2017
Tweet
Share
More Decks by haljik
See All by haljik
haljik
1
620
haljik
0
57
haljik
3
980
haljik
21
8k
haljik
22
6.8k
Other Decks in Programming
See All in Programming
nbkouhou
1
990
yaamaa
0
400
daiki1020
0
1.1k
hr01
0
1.6k
hr01
1
1.1k
jun0
3
630
makicamel
1
160
masayaaoyama
4
520
line_developers_tw
0
920
sullis
0
110
canon1ky
3
340
dictoss
0
160
Featured
See All Featured
akmur
252
19k
garrettdimon
287
110k
holman
461
280k
malarkey
119
16k
hatefulcrawdad
257
17k
chriscoyier
684
180k
edds
56
9.3k
swwweet
206
6.8k
chriscoyier
145
19k
wjessup
338
16k
pedronauck
652
110k
philhawksworth
192
8.8k
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
͋ͨΓΛಡΉͱ͍Ζ͍ΖΘ͔Γ·͢
͍Ζ͍Ζ͑ͦ͏ͳςΫχοΫ͋ Δ͚Ͳɺը໘ʮਫʯͳͷͰɺԿ ͔ಠࣗͷ෦Λ࡞ΓࠐΜͰ͏Α͏ ͳࣄΛؤுͬͯඅ༻ରޮՌബ͍ ༗ΓΛૉʹ͏͜ͱ͕େࣄ