рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдорд╛рдиреНрдпрддрд╛

рдпрд╣ рдкрд╛рда рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рд╣реИ: рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рддреЗ рд╕рдордп рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХреНрдпрд╛ рдиреБрдХрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрд┐рди рддрд░реАрдХреЛрдВ рдФрд░ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдорд╛рдиреНрдпрдХрд░рдг


рдореИрдВрдиреЗ рдЕрдХреНрд╕рд░ рдРрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдБ рджреЗрдЦреАрдВ рдЬрд┐рдирдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЪреБрдирдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рдИред рдЯреАрдореЛрдВ рдиреЗ рд╕рдордп рд╕реАрдорд╛ рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рджрдмрд╛рд╡ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдЯреАрдХ, рд╕реБрд╕рдВрдЧрдд рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдЙрдирдХрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рд╣рд░ рдЬрдЧрд╣ рдмрд┐рдЦрд░рд╛ рд╣реБрдЖ рд╣реИ: рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдирд┐рдкреЗрдЯ, рд╕реНрдХреНрд░реАрди рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ, рдмрд┐рдЬрдиреЗрд╕ рд▓реЙрдЬрд┐рдХ рдбрд┐рдмреНрдмреЗ, рдбреЛрдореЗрди рдПрдВрдЯрд┐рдЯреАрдЬрд╝, рдЯреНрд░рд┐рдЧрд░реНрд╕ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдХрдореА рдореЗрдВред рдпрд╣ рдХреЛрдб if-else рдХрдердиреЛрдВ рд╕реЗ рднрд░рд╛ рдерд╛, рдЗрд╕рдиреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдлреЗрдВрдХ рджрд┐рдпрд╛, рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдЯреБрдХрдбрд╝реЗ рдХреЛ рд╡рд╣рд╛рдВ рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ... рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЬреИрд╕реЗ рд╣реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреА рд╣реИ, рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рдорд╣рдВрдЧрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдХреНрд╕рд░ рдХрд╛рдлреА рднреНрд░рд╛рдордХ), рдФрд░ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдПрдХрд░реВрдкрддрд╛ред


рддреЛ рдХреНрдпрд╛ рдбреЗрдЯрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд░рд▓ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХрд╛ рд╣реИ? рдХреНрдпрд╛ рдХреЛрдИ рдРрд╕рд╛ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЕрдкрдардиреАрдпрддрд╛ рдХреЗ рдкрд╛рдк рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛, рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рдЬреЛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рднреА рддрд░реНрдХ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦреЗрдЧрд╛, рдФрд░ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЛрдХрдкреНрд░рд┐рдп рдЬрд╛рд╡рд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ?


рд╣рд╛рдВ, рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рд╣реИред


рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рд╕реАрдпреВрдмреАрдП рдордВрдЪ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЖрдк рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:


  1. рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдмрдиреЗрдВ рдФрд░ DRY рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ;
  2. рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдФрд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ;
  3. рдЬрд╣рд╛рдВ рдбреЗрд╡рд▓рдкрд░ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ;
  4. рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, SOAP рдХреЙрд▓, REST, рдЖрджрд┐ред
  5. рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВ;
  6. рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЪреЗрдХ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЖрд╡реЗрджрди рдХреЗ рдЕрдВрджрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  7. рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ, рд╕реНрдерд╛рдиреАрдп рд╕рдВрджреЗрд╢ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП;
  8. рдорд╛рдирдХреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред

рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ CUBA рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦреЗ рдЧрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реАрдпреВрдмреАрдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рдПрдХреНрд▓рд┐рдкреНрд╕рд▓рд┐рдВрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЕрдзрд┐рдХрд╛рдВрд╢ рддрдХрдиреАрдХреЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдЬрд╛рд╡рд╛ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреА рдЬреЛ рдЬреЗрдкреАрдП рдФрд░ рдмреАрди рд╡реИрд▓рд┐рдбреЗрд╢рди рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред


рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдХрдореА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдорд╛рдиреНрдпрддрд╛


рд╢рд╛рдпрдж рдбреЗрдЯрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрдо рдФрд░ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрддрд░ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрд╡рд╢реНрдпрдХ рдзреНрд╡рдЬ (рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдХреЗ рдореВрд▓реНрдп рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ), рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рдВрдмрд╛рдИ, рдЕрджреНрд╡рд┐рддреАрдп рдЕрдиреБрдХреНрд░рдорд┐рдд, рдЖрджрд┐ред рдпрд╣ рд╡рд┐рдзрд┐ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЖрдорддреМрд░ рдкрд░ рд╕рдЦреНрддреА рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдХреНрд╕рд░ рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдХреЗ рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдХрд╛рд░рдг рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмреАрдЪ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╡рд┐рддрд░рдг рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬреЛ рд╣рдо рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХреБрдЫ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрднрд╡ рд╕реЗ рднреА ... рдпрджрд┐ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рд╕рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдлрд╝реАрд▓реНрдб рдореЗрдВ 10 рд╡рд░реНрдг рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рддреЛ рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рдПрдЧрд╛: DDL рдореЗрдВ рдПрдХ DB рд╡рд╛рд╕реНрддреБрдХрд╛рд░, рдЗрд╕реА рдЗрдХрд╛рдИ рдореЗрдВ рдПрдХ рдмреИрдХреЗрдВрдб рдбреЗрд╡рд▓рдкрд░ рдФрд░ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдПрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ, UI рдбреЗрд╡рд▓рдкрд░ рд╕реАрдзреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рдлред рдлрд┐рд░ рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдХреНрд╖реЗрддреНрд░ 15 рд╡рд░реНрдгреЛрдВ рддрдХ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рдбреЗрд╡реЛрдкреНрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдУрд░ рд╕реЗ рдмрд╛рдзрд╛ рд╕рдорд╛рди рд╣реИ ...


рдХреЛрдИ рднреА рдбреЗрд╡рд▓рдкрд░ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдХреИрд╕реЗ рдмрдЪрд╛ рдЬрд╛рдП - рд╕рддреНрдпрд╛рдкрди рдХреЛ рдХреЗрдВрджреНрд░реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП! CUBA рдореЗрдВ, JPA рдЗрдХрд╛рдИ рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рдРрд╕реА рдорд╛рдиреНрдпрддрд╛ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдореЗрдЯрд╛-рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕реАрдпреВрдмреАрдП рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕рд╣реА рдбреАрдбреАрдПрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдкрдпреБрдХреНрдд рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред


рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЙрджрд╛рд╣рд░рдг


рдпрджрд┐ рдПрдиреЛрдЯреЗрд╢рди рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ CUBA DDL рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ, рддреЛ рдирдП JPA- рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рддрд┐рдмрдВрдз рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдВрдЧреЗред


рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрддрд░ рдкрд░ рд╕рд╛рджрдЧреА рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЬреЛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдкреВрд░реНрдг рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рджреЗрддрд╛ рд╣реИ, рдЬреЗрдкреАрдП рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рджрд╛рдпрд░рд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИ рдЬреЛ рдбреАрдбреАрдПрд▓ рдорд╛рдирдХ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдЯреНрд░рд┐рдЧрд░ рдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпрд╡рд┐рдзрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред рддреЛ, JPA- рдЖрдзрд╛рд░рд┐рдд рдмрд╛рдзрд╛рдПрдВ рдЗрдХрд╛рдИ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рдпрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддреА рд╣реИрдВ рдпрд╛ рдЕрдзрд┐рдХрддрдо рд╕реНрддрдВрдн рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдЖрдк @UniqueConstraint рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрд▓рдо рдХреЗ рд╕рдВрдпреЛрдЬрди рдкрд░ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдкреНрд░рддрд┐рдмрдВрдз рднреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд╣ рд╢рд╛рдпрдж рд╕рдм рдХреБрдЫ рд╣реИред


рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдиреНрдпреВрдирддрдо / рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛, рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдорд╛рдиреНрдп рдХрд░рдирд╛, рдпрд╛ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдЪреЗрдХ рдХрд░рдирд╛, "рдмреАрди рд╕рддреНрдпрд╛рдкрди" рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред ред


рдмреАрди рд╕рддреНрдпрд╛рдкрди


рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд▓рдВрдмреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рд╡рд╛рд▓реЗ рдорд╛рдирдХреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рд╣рдЬрд╛рд░реЛрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рд╕рд╛рдмрд┐рдд рд╣реБрдИ рд╣реИред рдЬрд╛рд╡рд╛ рдмреАрди рд╡реИрд▓рд┐рдбреЗрд╢рди JSR 380, 349, рдФрд░ 303 рдФрд░ рдЙрдирдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ: рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд╡реИрд▓рд┐рдбреЗрдЯрд░ рдФрд░ рдЕрдкрд╛рдЪреЗ рдмреАрд╡реАрдПрд▓ ред


рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдЕрдХреНрд╕рд░ рдЗрд╕реЗ рдХрдо рдХрд░рдХреЗ рдЖрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рд░рд╛рд╕рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рднреА рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд╕, рдордЬрд╝рдмреВрддреА рд╕реЗ рдФрд░ рдпрдерд╛рд╕рдВрднрд╡ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рдХрд░реАрдмред


рдмреАрди рд╡реИрд▓рд┐рдбреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХрдИ рдлрд╛рдпрджреЗ рдорд┐рд▓рддреЗ рд╣реИрдВ:


  • рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ: рдмрд┐рди рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдФрд░ рд╕рд╣реА рдорд╛рдпрдиреЗ рдореЗрдВ рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рддрд░реАрдХреЗ рд╕реЗ рд╣реЛрддреА рд╣реИред
  • рдмреАрди рд╕рддреНрдпрд╛рдкрди рдорд╛рдирдХ рд╣рдореЗрдВ рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рджрд░реНрдЬрдиреЛрдВ рд╕рддреНрдпрд╛рдкрди рдПрдиреЛрдЯреЗрд╢рди рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: @Size , @Min , @Max , @Pattern , @Email , @Past , рдХрд╛рдлреА рдорд╛рдирдХ @URL , @Length , рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА @ScriptAssert рдФрд░ рдХрдИ рдЕрдиреНрдп ред
  • рдорд╛рдирдХ рд╣рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдПрдиреЛрдЯреЗрд╢рди рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдПрдХ рдирдпрд╛ рдПрдиреЛрдЯреЗрд╢рди рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЬрд╛рд╡рд╛ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
    рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @ValidPassportNumber рд╡рд░реНрдЧ рдХрд╛ рд╕реНрддрд░ рдПрдиреЛрдЯреЗрд╢рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рд╕рдкреЛрд░реНрдЯ рдирдВрдмрд░ country рдХреНрд╖реЗрддреНрд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
  • рдмрд╛рдзрд╛рдУрдВ рдХреЛ рди рдХреЗрд╡рд▓ рдЦреЗрддреЛрдВ рдпрд╛ рд╡рд░реНрдЧреЛрдВ рдкрд░, рдмрд▓реНрдХрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рднреА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ "рдЕрдиреБрдмрдВрдз рджреНрд╡рд╛рд░рд╛ рд╕рддреНрдпрд╛рдкрди" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджрд░реНрдЬ рдХреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдмрдорд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ CUBA рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо (рдХреБрдЫ рдЕрдиреНрдп рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рддрд░рд╣) рдмреАрди рд╡реИрд▓рд┐рдбреЗрд╢рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рддреБрд░рдВрдд рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдмрд┐рди рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рдЖрдЗрдП рд╣рдо рдкрд╛рд╕рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рд╣рдо рдЗрд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЗрдХрд╛рдИ рдХреЗ рдХрдИ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░реЗрдВрдЧреЗ:


  • name рдлрд╝реАрд▓реНрдб 2 рдпрд╛ рдЕрдзрд┐рдХ рд╡рд░реНрдг рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, regexp рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди "рдЪрд╛рд░реНрд▓реНрд╕ рдУрдЧрд┐рдпрд░ рдбреЗ рдмрддреНрддреНрдЬрд╝ рдбреЗ Castelmore Comte d'Artagnan" рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди "R2D2" рдирд╣реАрдВ рдХрд░реЗрдЧрд╛);
  • height (рдКрдВрдЪрд╛рдИ) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: 0 < height <= 300 рд╕реЗрдореА;
  • email рдлрд╝реАрд▓реНрдб рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рд╣реА рдИрдореЗрд▓ рдХреЗ рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реЛред

рдЗрди рд╕рднреА рдЬрд╛рдВрдЪреЛрдВ рдХреЗ рд╕рд╛рде, рд╡реНрдпрдХреНрддрд┐ рд╡рд░реНрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:


 @Listeners("passportnumber_PersonEntityListener") @NamePattern("%s|name") @Table(name = "PASSPORTNUMBER_PERSON") @Entity(name = "passportnumber$Person") @ValidPassportNumber(groups = {Default.class, UiCrossFieldChecks.class}) @FraudDetectionFlag public class Person extends StandardEntity { private static final long serialVersionUID = -9150857881422152651L; @Pattern(message = "Bad formed person name: ${validatedValue}", regexp = "^[AZ][az]*(\\s(([az]{1,3})|(([az]+\\')?[AZ][az]*)))*$") @Length(min = 2) @NotNull @Column(name = "NAME", nullable = false) protected String name; @Email(message = "Email address has invalid format: ${validatedValue}", regexp = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$") @Column(name = "EMAIL", length = 120) protected String email; @DecimalMax(message = "Person height can not exceed 300 centimeters", value = "300") @DecimalMin(message = "Person height should be positive", value = "0", inclusive = false) @Column(name = "HEIGHT") protected BigDecimal height; @NotNull @Column(name = "COUNTRY", nullable = false) protected Integer country; @NotNull @Column(name = "PASSPORT_NUMBER", nullable = false, length = 15) protected String passportNumber; ... } 

Person.java


рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ @DecimalMin , @Length , @Pattern , @Pattern рдФрд░ рдЬреИрд╕реЗ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдЗрдП @ValidPassportNumber рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред


рд╣рдорд╛рд░рд╛ рдмреНрд░рд╛рдВрдб рдирдпрд╛ @ValidPassportNumber рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ Person#passportNumber рджреЗрд╢ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рджреЗрд╢ рдХреЗ рд▓рд┐рдП regexp рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред


рдкрд╣рд▓реЗ, рдЖрдЗрдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рджреЗрдЦреЗрдВ ( рд╕реАрдпреВрдмреАрдП рдпрд╛ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдореИрдиреБрдЕрд▓ рдареАрдХ рд╣реИрдВ), рдЗрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдореЗрдВ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ рдЗрд╕ рдирдП рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ groups рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЗрд╕рдХреЗ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ UiCrossFieldChecks.class рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдиреНрдпрддрд╛ рдХреНрд░реЙрд╕ рдкрд░ рдЪрд▓рд╛рдИ рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рд╕рддреНрдпрд╛рдкрди - рд╕рднреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдФрд░ Default.class рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рддреНрдпрд╛рдкрди рд╕рдореВрд╣ рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред


рдПрдиреЛрдЯреЗрд╢рди рд╡рд┐рд╡рд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = ValidPassportNumberValidator.class) public @interface ValidPassportNumber { String message() default "Passport number is not valid"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } 

ValidPassportNumber.java


рдпрд╣рд╛рдВ @Target(ElementType.TYPE) рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд░рдирдЯрд╛рдЗрдо рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╡рд░реНрдЧ рд╣реИ, рдФрд░ @Constraint(validatedBy = тАж ) рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рддреНрдпрд╛рдкрди ValidPassportNumberValidator рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ ValidPassportNumberValidator ConstraintValidator<...> рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рд╕реНрд╡рдпрдВ isValid(...) рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХреЛ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рддрд╛ рд╣реИ:


 public class ValidPassportNumberValidator implements ConstraintValidator<ValidPassportNumber, Person> { public void initialize(ValidPassportNumber constraint) { } public boolean isValid(Person person, ConstraintValidatorContext context) { if (person == null) return false; if (person.country == null || person.passportNumber == null) return false; return doPassportNumberFormatCheck(person.getCountry(), person.getPassportNumber()); } private boolean doPassportNumberFormatCheck(CountryCode country, String passportNumber) { ... } } 

ValidPassportNumberValidator.java


рд╡рд╣ рд╕рдм рд╣реИред рд╕реАрдпреВрдмреАрдП рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдХреБрдЫ рднреА рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛ рд╣рдорд╛рд░реЗ рдХрд╕реНрдЯрдо рд╕рддреНрдпрд╛рдкрди рдХрд╛рдо рдХрд░реЗрдЧреА рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЗрдЧреАред
рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛?


рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ CUBA рдХреЗ рдкрд╛рд╕ рдЕрдиреНрдп рдирд┐рд╢рдХреНрддрдХреА рд╣реИрдВ: рдпрд╣ рди рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрди рд▓рд╛рд▓ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рднреА рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рддрд╛ рд╣реИ рдЬреЛ рд╕реЗрдо рд╕рддреНрдпрд╛рдкрди рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ:


рдпреВрдЖрдИ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡


рдПрдХ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ? рдЖрдкрдХреЛ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рд╣реА рдЬрд╛рд╡рд╛ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдХрд░ UI рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рджрд░реНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИред


рдЕрдиреБрднрд╛рдЧ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмреАрди рд╕рддреНрдпрд╛рдкрди рдХреЗ рдлрд╛рдпрджреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдВ:


  1. рдпрд╣ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдкрдардиреАрдп рд╣реИ;
  2. рдЖрдкрдХреЛ рдЗрдХрд╛рдИ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реАрдзреЗ рдореВрд▓реНрдп рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
  3. рдпрд╣ рдЕрдиреБрдХреВрд▓рд┐рдд рдФрд░ рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
  4. рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдУрдЖрд░рдПрдо рдореЗрдВ рдПрдХреАрдХреГрдд, рдФрд░ рдЪреЗрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ;
  5. рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпреВрдЖрдИ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИ (рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ Validator рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ) рдХреБрдЫ рдлреНрд░реЗрдо рдмреАрди рд╕рддреНрдпрд╛рдкрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ;
  6. рдмреАрди рд╕рддреНрдпрд╛рдкрди рдПрдХ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдорд╛рдирдХ рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рднрд░рд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╡рд┐рдзрд┐, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдпрд╛ REST рдкрддреЗ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдХрдИ рдФрд░ рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдмрд╛рдК рдХреЛрдб рд▓рд┐рдЦреЗ рдмрд┐рдирд╛, рд╡рд┐рдзрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?


рдЙрддреНрддрд░ рд╕рд░рд▓ рд╣реИ: рдмреАрди рд╕рддреНрдпрд╛рдкрди рддрд░реАрдХреЛрдВ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ!


рдЕрдиреБрдмрдВрдз рджреНрд╡рд╛рд░рд╛ рдорд╛рдиреНрдпрддрд╛


рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рддреНрдпрд╛рдкрди рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕реНрд╡рдд: рд╕рддреНрдпрд╛рдкрди рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╕реЗ рдХрдИ рддрд░реАрдХреЗ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рди рдХреЗрд╡рд▓ рдЖрд░рдИрдПрд╕рдЯреА рдпрд╛ рдПрд╕рдУрдПрдкреА рдкрддреЗ рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЙрд▓реЛрдВ рдХреА рдкреВрд░реНрд╡ рд╢рд░реНрдд рдФрд░ рдкреЛрд╕реНрдЯрдХрдВрдбрд┐рд╢рди рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реАрдорд╛ рдореЗрдВ рд╣реИ, рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдмреАрди рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдЬрд╛рд╡рд╛ рд╡рд░реНрдЧ рдореЗрдВ рдЙрдирдХреЗ рдХреЙрд▓ рдХреА рдкреВрд░реНрд╡ рд╢рд░реНрдд рдФрд░ рдкреЛрд╕реНрдЯрдХрдВрдбрд┐рд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХреЛрдВ рдкрд░ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВ:


  1. рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдореЗрдВ рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, IllegalArgumentException рдФрд░ рдЗрд╕реА рддрд░рд╣ рдлреЗрдВрдХрдХрд░)ред рдЖрдк рдШреЛрд╖рд┐рдд рд░реВрдк рд╕реЗ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╕рдордЭ рдФрд░ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ;
  2. рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░, рдкреБрди: рдЙрдкрдпреЛрдЧ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЪреЗрдХ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдХрдо рдХреЛрдб рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрдо рдХреАрдбрд╝реЗред
  3. рдпрджрд┐ рд╡рд░реНрдЧ, рд╡рд┐рдзрд┐ рдпрд╛ рдЙрд╕рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЛ @Validated рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рджреНрд╡рд╛рд░рд╛ рд╣рд░ рдмрд╛рд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдЪреЗрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  4. рдпрджрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛ @Documented рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдкреНрд░реА- рдФрд░ рдкреЛрд╕реНрдЯрдХреЙрдиреНрдбрд┐рд╢рди рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП JavaCoc рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

'рдЕрдиреБрдмрдВрдз рд╕рддреНрдпрд╛рдкрди' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рд╕реНрдкрд╖реНрдЯ, рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдП рд░рдЦрд╛ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ CUBA рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ REST рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рджреЗрдЦреЗрдВред PersonApiService рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрдкрдХреЛ getPersons() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ addNewPerson(...) рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рд╡реНрдпрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА addNewPerson(...) ред


рдФрд░ рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╕реЗрдо рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ! рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ, рдпрд╛ рдХреНрд╖реЗрддреНрд░, рдпрд╛ рд╡рд┐рдзрд┐ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рд╡рд░реНрдЧ рдЬреЛ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣реА рд╕рддреНрдпрд╛рдкрди рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдЕрдзреАрди рд╣реЛрдВрдЧреЗред


 @Validated public interface PersonApiService { String NAME = "passportnumber_PersonApiService"; @NotNull @Valid @RequiredView("_local") List<Person> getPersons(); void addNewPerson( @NotNull @Length(min = 2, max = 255) @Pattern(message = "Bad formed person name: ${validatedValue}", regexp = "^[AZ][az]*(\\s(([az]{1,3})|(([az]+\\')?[AZ][az]*)))*$") String name, @DecimalMax(message = "Person height can not exceed 300 cm", value = "300") @DecimalMin(message = "Person height should be positive", value = "0", inclusive = false) BigDecimal height, @NotNull CountryCode country, @NotNull String passportNumber ); } 

PersonApiService.java


рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ?
_ (рдПрдиреЛрдЯреЗрд╢рди @RequiredView(тАЬ_localтАЭ) рдХреЛ рдЫреЛрдбрд╝рдХрд░, CUBA рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рд▓реМрдЯреА рд╣реБрдИ Person рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ PASSPORTNUMBER_PERSON рдЯреЗрдмрд▓ рд╕реЗ рд╕рднреА рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВред)


@Valid рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдЧреНрд░рд╣ рдСрдмреНрдЬреЗрдХреНрдЯ getPersons() рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд╣ рднреА Person рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


CUBA рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд┐рдореНрди рдкрддреЗ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:


  • / app / рдмрд╛рдХреА / v2 / рд╕реЗрд╡рд╛рдУрдВ / passportnumber_PersonApiService / getPersons
  • / app / рдмрд╛рдХреА / v2 / рд╕реЗрд╡рд╛рдУрдВ / passportnumber_PersonApiService / addNewPerson

рдЖрдЗрдП, рдбрд╛рдХрд┐рдпрд╛ рдЖрд╡реЗрджрди рдЦреЛрд▓реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


рдбрд╛рдХрд┐рдпрд╛ рдРрдк


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд╛рд╕рдкреЛрд░реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ addNewPerson рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдХреНрд░реЙрд╕-рдЪреЗрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ passportNumber рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдкрд╕рдВрдж country рдХреНрд╖реЗрддреНрд░ рдХреЗ рдореВрд▓реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдпрд╣ рдХреНрд░реЙрд╕-рдорд╛рдиреНрдпрддрд╛ рд╡рд░реНрдЧ-рд╕реНрддрд░реАрдп рдЗрдХрд╛рдИ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рдПрдХ рдкреВрд░реНрдг рдПрдирд╛рд▓реЙрдЧ рд╣реИ!


рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдХреНрд░реЙрд╕-рд╕рддреНрдпрд╛рдкрди рдЬреЗрдПрд╕рдЖрд░ 349 рдФрд░ 380 рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдЖрдк рд╡рд░реНрдЧ / рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреНрд░реЙрд╕-рд╕рддреНрдпрд╛рдкрди рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


рдмреАрди рдХреЗ рдмрд╛рд╣рд░ рд╕рддреНрдпрд╛рдкрди


рджреБрдирд┐рдпрд╛ рдореЗрдВ рдкреВрд░реНрдгрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реЗрдо рд╕рддреНрдпрд╛рдкрди рдХреА рдЕрдкрдиреА рдХрдорд┐рдпрд╛рдВ рдФрд░ рд╕реАрдорд╛рдПрдВ рд╣реИрдВ:


  1. рдХрднреА-рдХрднреА рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдПрдХ рдЬрдЯрд┐рд▓ рдЧреНрд░рд╛рдл рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдЖрджреЗрд╢ рдХреЗ рд╕рднреА рддрддреНрд╡ рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рд░рдЦреЗ рдЧрдП рд╣реИрдВред рдпрд╣ рдПрдХ рдХрдард┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдФрд░ рд╣рд░ рдмрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдСрд░реНрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪреЗрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╣реЛ рд╕рдХрддреА рд╣реИ: рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ Order рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЙрд╕рдХреЗ OrderItem рд╕рдмреЛрдмрд┐рдЬ рдХреЛ рд╕реЗрд╡ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗред
  2. рдХреБрдЫ рдЪреЗрдХ рдПрдХ рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╕реНрдЯреЛрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдСрд░реНрдбрд░ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рди рдХреА рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдРрд╕рд╛ рдЪреЗрдХ рдХреЗрд╡рд▓ рдПрдХ рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╣реИ рдФрд░ рд╕реНрдЯреЙрдХ рдореЗрдВ рдорд╛рд▓ рдХреА рдорд╛рддреНрд░рд╛ рдХрд┐рд╕реА рднреА рд╕рдордп рдмрджрд▓ рд╕рдХрддреА рд╣реИред

CUBA рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рджреЛ рдкреВрд░реНрд╡-рдкреНрд░рддрд┐рдмрджреНрдз рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрдХрд╛рдИ рд╢реНрд░реЛрддрд╛ рдФрд░ рд▓реЗрди-рджреЗрди рд╢реНрд░реЛрддрд╛ рдХрд╣рддреЗ рд╣реИрдВ ред рдЖрдЗрдП рдЙрди рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


рдЗрдХрд╛рдИ рд╕реВрдЪреАрдмрджреНрдШ


CUBA рдореЗрдВ рдПрдВрдЯрд┐рдЯреА рд╢реНрд░реЛрддрд╛ PreInsertEvent , PreUpdateEvent рдФрд░ PredDeleteEvent рд╢реНрд░реЛрддрд╛рдУрдВ рд╕реЗ рдмрд╣реБрдд рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рд╣реИрдВ рдЬреЛ JPA рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рддрдВрддреНрд░ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрдХрд╛рдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред


CUBA рдореЗрдВ, рдПрдХ рдЗрдХрд╛рдИ рд╢реНрд░реЛрддрд╛ рдмрдирд╛рдирд╛ рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рджреЛ рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  1. рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рдмреАрди рдмрдирд╛рдПрдБ рдЬреЛ рдХрд┐ рдПрдХ рд╢реНрд░реЛрддрд╛ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП 3 рдЗрдВрдЯрд░рдлреЗрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ:
    BeforeDeleteEntityListener<T>
    BeforeInsertEntityListener<T>
    BeforeUpdateEntityListener<T>
  2. рдЙрд╕ рдЗрдХрд╛рдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ @Listeners рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред

рдФрд░ рд╡рд╣ рд╕рдм рд╣реИред


рдЬреЗрдкреАрдП рдорд╛рдирдХ (рдЬреЗрдПрд╕рдЖрд░ 338, рдзрд╛рд░рд╛ 3.5) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рд╕реАрдпреВрдмреАрдП рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╢реНрд░реЛрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдЯрд╛рдЗрдк рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА Object рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд░реНрдХ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред CUBA рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдпрд╛ EntityManager рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд▓реЛрдб рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд░рдЦрддрд╛ рд╣реИред рдпреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдХрд╛рдп рд╢реНрд░реЛрддрд╛ рдХреЛ рднреА рдЖрдордВрддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред


рд╕реАрдпреВрдмреАрдП рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо "рд╕реЙрдлреНрдЯ рдбрд┐рд▓реАрдЯреЗрд╢рди" рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд╣рд╛рдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рджреБрд░реНрдЧрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореБрд▓рд╛рдпрдо рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо AfterDeleteEntityListener / AfterDeleteEntityListener рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди PreUpdate / PostUpdate рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред


рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдпрд╣рд╛рдБ, рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдмреАрди рдХреЛрдб рдХреА рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдЗрдХрд╛рдИ рд╡рд░реНрдЧ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ: @Listeners рдПрдиреЛрдЯреЗрд╢рди, рдЬреЛ рд╢реНрд░реЛрддрд╛ рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ:


 @Listeners("passportnumber_PersonEntityListener") @NamePattern("%s|name") @Table(name = "PASSPORTNUMBER_PERSON") @Entity(name = "passportnumber$Person") @ValidPassportNumber(groups = {Default.class, UiCrossFieldChecks.class}) @FraudDetectionFlag public class Person extends StandardEntity { ... } 

Person.java


рд╢реНрд░реЛрддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреБрдж рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 /** * Checks that there are no other persons with the same * passport number and country code * Ignores spaces in the passport number for the check. * So numbers "12 45 768007" and "1245 768007" and "1245768007" * are the same for the validation purposes. */ @Component("passportnumber_PersonEntityListener") public class PersonEntityListener implements BeforeDeleteEntityListener<Person>, BeforeInsertEntityListener<Person>, BeforeUpdateEntityListener<Person> { @Override public void onBeforeDelete(Person person, EntityManager entityManager) { if (!checkPassportIsUnique(person.getPassportNumber(), person.getCountry(), entityManager)) { throw new ValidationException( "Passport and country code combination isn't unique"); } } @Override public void onBeforeInsert(Person person, EntityManager entityManager) { // use entity argument to validate the Person object // entityManager could be used to access database // if you need to check the data // throw ValidationException object if validation check failed if (!checkPassportIsUnique(person.getPassportNumber(), person.getCountry(), entityManager)) throw new ValidationException( "Passport and country code combination isn't unique"); } @Override public void onBeforeUpdate(Person person, EntityManager entityManager) { if (!checkPassportIsUnique(person.getPassportNumber(), person.getCountry(), entityManager)) throw new ValidationException( "Passport and country code combination isn't unique"); } ... } 

PersonEntityListener.java


рдЕрдЧрд░ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ рддреЛ рд╢реНрд░реЛрддрд╛ рд╢реНрд░реЛрддрд╛ рд╣реИрдВ:


  • рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЗрдХрд╛рдИ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ;
  • рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдСрд░реНрдбрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЙрдХ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЙрддреНрдкрд╛рдж рд╣реИ;
  • рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдЗрдХрд╛рдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ Order , рд▓реЗрдХрд┐рди рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рднреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Order рдпреВрдирд┐рдЯ рдХреЗ рд▓рд┐рдП OrderItems ;
  • рд╣рдо рдХреЗрд╡рд▓ рдХреБрдЫ рдирд┐рдХрд╛рдп рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдиреНрд╕рд░реНрдЯ, рдЕрдкрдбреЗрдЯ рдпрд╛ рдбрд┐рд▓реАрдЯ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ Order рдФрд░ OrderItem , рдФрд░ рд╣рдореЗрдВ рд▓реЗрди-рджреЗрди рдХреЗ рджреМрд░рд╛рди рдЕрдиреНрдп рдПрдВрдЯрд┐рдЯреА рдХреНрд▓рд╛рд╕реЗрд╕ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд▓реЗрди-рджреЗрди рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ


рд╕реАрдпреВрдмреАрдП рд▓реЗрдирджреЗрди рд╢реНрд░реЛрддрд╛ рд▓реЗрдирджреЗрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рднреА рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдЗрдХрд╛рдИ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдпреЗ рдЙрдиреНрд╣реЗрдВ рд╕реБрдкрд░ рдкрд╛рд╡рд░ рджреЗрддреЗ рд╣реИрдВ:


  • рдХреБрдЫ рднреА рдЙрдирдХреЗ рдзреНрдпрд╛рди рд╕реЗ рдмрдЪ рдирд╣реАрдВ рд╕рдХрддрд╛ред

рд▓реЗрдХрд┐рди рд╡рд╣реА рдЙрдирдХреА рдХрдорд┐рдпреЛрдВ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ:


  • рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ;
  • рд╡реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
  • рдЙрдиреНрд╣реЗрдВ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рд▓реЗрдирджреЗрди рдХреЗ рд╢реНрд░реЛрддрд╛ рдореЗрдВ рдПрдХ рдмрдЧ рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдореЗрдВ рднреА рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд▓реЗрди-рджреЗрди рд╢реНрд░реЛрддрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдПрдХ рд╣реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрдХрд▓ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрдмрд░ рдзреЛрдЦрд╛рдзрдбрд╝реА рдХреЗ рд╕рднреА рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЬреЛ рдЖрдкрдХреЗ рд╕рднреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реЗрд╡рд╛ рдХрд░рддрд╛ рд╣реИред


рдЖрдк рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ!


рдПрдХ рдирдореВрдиреЗ рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдЬреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрдХрд╛рдИ рдореЗрдВ @FraudDetectionFlag рдПрдиреЛрдЯреЗрд╢рди рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рд╣реИ, рддреЛ рдПрдХ рдзреЛрдЦрд╛рдзрдбрд╝реА рдбрд┐рдЯреЗрдХреНрдЯрд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ: рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд▓реЗрдирджреЗрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХреЛ рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


 @Component("passportnumber_ApplicationTransactionListener") public class ApplicationTransactionListener implements BeforeCommitTransactionListener { private Logger log = LoggerFactory.getLogger(ApplicationTransactionListener.class); @Override public void beforeCommit(EntityManager entityManager, Collection<Entity> managedEntities) { for (Entity entity : managedEntities) { if (entity instanceof StandardEntity && !((StandardEntity) entity).isDeleted() && entity.getClass().isAnnotationPresent(FraudDetectionFlag.class) && !fraudDetectorFeedAndFastCheck(entity)) { logFraudDetectionFailure(log, entity); String msg = String.format( "Fraud detection failure in '%s' with id = '%s'", entity.getClass().getSimpleName(), entity.getId()); throw new ValidationException(msg); } } } ... } 

ApplicationTransactionListener.java


рдПрдХ рд▓реЗрди-рджреЗрди рд╢реНрд░реЛрддрд╛ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рдмреАрди рдХреЛ рдкрд╣рд▓реЗ BeforeCommitTransactionListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдкрд╣рд▓реЗ beforeCommit рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд▓реЗрди-рджреЗрди рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрдиреЗ рдЖрдк рдмрдВрдз рдЬрд╛рддреЗ рд╣реИрдВред BeforeCommitTransactionListener рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд▓реЗрдирджреЗрди рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ BeforeCommitTransactionListener рдпрд╛ AfterCompleteTransactionListener рдХреЛ рд▓рд╛рдЧреВ BeforeCommitTransactionListener ред


рдирд┐рд╖реНрдХрд░реНрд╖


рдмреАрди рд╕рддреНрдпрд╛рдкрди (рдЬреЗрдкреАрдП 303, 349 рдФрд░ 980) рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рдПрдХ рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдорд╛рдорд▓реЛрдВ рдХреЗ 95% рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рд╕реАрдзреЗ рдбреЛрдореЗрди рдореЙрдбрд▓ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕реЗ рдЦреЛрдЬрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╕реНрдкреНрд░рд┐рдВрдЧ, рд╕реАрдпреВрдмреАрдП рдФрд░ рдХрдИ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрди рдорд╛рдирдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдпреВрдЖрдИ рдкрд░рдд рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рдорд╛рдиреНрдп рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдУрдЖрд░рдПрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдмреАрди рд╕рддреНрдпрд╛рдкрди рдЕрдХреНрд╕рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЬрд╛рджреВ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред


рдХреБрдЫ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╡рд┐рд╖рдп рдореЙрдбрд▓ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рдФрд░ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпреВрдЖрдИ рд╕реНрддрд░ рдкрд░ рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди рдПрдХ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡реА рд░рдгрдиреАрддрд┐ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдШрдЯрдХреЛрдВ рдФрд░ рдпреВрдЖрдИ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рдХрдИ рд╕рддреНрдпрд╛рдкрди рдмрд┐рдВрджреБ рд╕рдмрд╕реЗ рддрд░реНрдХрд╕рдВрдЧрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рд╣реИрдВред , , , , , listener' .


, , :


  1. JPA , , DDL.
  2. Bean Validation тАФ , , , . , .
  3. bean validation, . , , REST.
  4. Entity listeners: , Bean Validation, . , . Hibernate .
  5. Transaction listeners тАФ , , . , , .

PS: , Java, , , .




рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ


рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда

рдорд╛рдирдХреЛрдВ рдФрд░ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди



рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ






Source: https://habr.com/ru/post/hi427543/


All Articles