рдЬрд╛рд╡рд╛ 8 рд╡рд┐рдзрд┐ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рд╕рдВрдкрддреНрддрд┐ рд╢рд╛рдмреНрджрд┐рдХ рдЕрдиреБрдХрд░рдг


рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ nameOf рдСрдкрд░реЗрдЯрд░ рдХреА рдХрдореА рдХреЗ рдЕрдкрд░рд╛рдз рдиреЗ рдореБрдЭреЗ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рдЕрдзреАрд░ рдХреЗ рд▓рд┐рдП - рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрд░реЛрддреЛрдВ рдФрд░ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдореЗрдВ рддреИрдпрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

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

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

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдХрдЯ рдХреЗ рддрд╣рдд, рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдЦреЛрдЬ рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рдореИрдкрд┐рдВрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди API рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 new SearchMapping().entity(Address.class) .indexed() .property("city", ElementType.METHOD) .field(); 

рдпрд╛ рдмреАрди рд╡реИрд▓рд┐рдбреЗрд╢рди рдПрдкреАрдЖрдИ рд╕реЗ validateValue() рд╡рд┐рдзрд┐, рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдЦрд┐рд▓рд╛рдл рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ:

 Set<ConstraintViolation<Address>> violations = validator.validateValue(Address.class, "city", "Purbeck" ); 

рджреЛрдиреЛрдВ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, Address рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА city рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП String рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рд╕реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ:
  • рдкрддрд╛ рд╡рд░реНрдЧ рдореЗрдВ city рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╛, рдЬрдм рдХреЛрдИ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧреЗрдЯ / рд╕реЗрдЯ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╛рдо рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рднреВрд▓ рд╕рдХрддрд╛ рд╣реИред
  • validateValue() рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд╛рд░рд┐рдд рдореВрд▓реНрдп рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

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

 mapping.entity(Address.class) .indexed() .property(Address::city, ElementType.METHOD ) .field(); 

рдФрд░:

 validator.validateValue(Address.class, Address::city, "Purbeck"); 

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

рдЬрд╛рд╡рд╛ 8 рд╡рд┐рдзрд┐ рд╕рдВрджрд░реНрдн


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

рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЧреЗрдЯреНрдЯрд░ рд╡рд┐рдзрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 validator.validateValue(Address.class, Address::getCity, "Purbeck"); 

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЧрдЯрд░ рд╣реЛред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреА рдХрдХреНрд╖рд╛рдПрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА JavaBeans рдХрдиреНрд╡реЗрдВрд╢рди рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреА рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдареАрдХ рд╣реИред

validateValue() рд╡рд┐рдзрд┐ validateValue() рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдХреНрдпрд╛ рджрд┐рдЦрддреА рд╣реИ? рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдирдП Function рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ:

 public <T, P> Set<ConstraintViolation<T>> validateValue( Class<T> type, Function<? super T, P> property, P value); 

рджреЛ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмрд┐рди рдкреНрд░рдХрд╛рд░, рдЧреБрдг, рдФрд░ рдкрд╛рд░рд┐рдд рдореВрд▓реНрдп рд╕рд╣реА рд╣реИрдВред рдПрдкреАрдЖрдИ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╣рдореЗрдВ рд╡рд╣ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдЖрдИрдбреАрдИ рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ Address:: рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдкреВрд░рдХ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╡реИрджреНрдпреБрдд рд╡рд┐рдзрд┐ validateValue() рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ Function рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?

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

рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП ByteBuddy


рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдЪрд╛рд▓ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╣реИ! рдЯрд╛рдЗрдк рдЯреА рдХрд╛ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдХрд░, рд╣рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рдХреЙрд▓ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЙрд╕рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рд╣реИред (рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЧрддрд┐рд╢реАрд▓ рдЬрд╛рд╡рд╛ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ - java.lang.reflect.Proxy)ред

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

рдЖрдЗрдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рд╣рдореЗрдВ рд╡рд┐рдзрд┐ рд╕рдВрджрд░реНрдн рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

 public interface PropertyNameCapturer { String getPropertyName(); void setPropertyName(String propertyName); } 

рдЕрдм рд╣рдо ByteBuddy рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдЙрди рдкреНрд░реЙрдХреНрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░реБрдЪрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдкрддрд╛) рдФрд░ PropertyNameCapturer рд▓рд╛рдЧреВ рдХрд░реЗрдВ:

 public <T> T /* & PropertyNameCapturer */ getPropertyNameCapturer(Class<T> type) { DynamicType.Builder<?> builder = new ByteBuddy() (1) .subclass( type.isInterface() ? Object.class : type ); if (type.isInterface()) { (2) builder = builder.implement(type); } Class<?> proxyType = builder .implement(PropertyNameCapturer.class) (3) .defineField("propertyName", String.class, Visibility.PRIVATE) .method( ElementMatchers.any()) (4) .intercept(MethodDelegation.to( PropertyNameCapturingInterceptor.class )) .method(named("setPropertyName").or(named("getPropertyName"))) (5) .intercept(FieldAccessor.ofBeanProperty()) .make() .load( (6) PropertyNameCapturer.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER ) .getLoaded(); try { @SuppressWarnings("unchecked") Class<T> typed = (Class<T>) proxyType; return typed.newInstance(); (7) } catch (InstantiationException | IllegalAccessException e) { throw new HibernateException( "Couldn't instantiate proxy for method name retrieval", e ); } } 

рдХреЛрдб рдереЛрдбрд╝рд╛ рднреНрд░рд╛рдордХ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕реЗ рд╕рдордЭрд╛рдПрдВред рдкрд╣рд▓реЗ рд╣рдореЗрдВ ByteBuddy (1) рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ DSL рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдпрд╛ рддреЛ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ (рдпрджрд┐ рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рд╣реИ) рдпрд╛ рд╡рд╛рд░рд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ) (2)ред

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХрд╛рд░ PropertyNameCapturer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдкрддреНрддрд┐ (3) рдХреЗ рдирд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рддрд░реАрдХреЛрдВ рд╕реЗ рдХреЙрд▓ рдХреЛ PropertyNameCapturingInterceptor (4) рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЗрд╡рд▓ setPropertyName () рдФрд░ getPropertyName () (PropertyNameCapturer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ) рдкрд╣рд▓реЗ рдмрдирд╛рдИ рдЧрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдкрддреНрддрд┐ (5) рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдВрдд рдореЗрдВ, рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (6) рдФрд░ рддреНрд╡рд░рд┐рдд (7)ред

рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░реЙрдХреНрд╕реА рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж рдмрд╛рдЗрдЯрдмреЙрдбреА, рдпрд╣ рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рдХреЙрд▓ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдкрд░ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ:

 public class PropertyNameCapturingInterceptor { @RuntimeType public static Object intercept(@This PropertyNameCapturer capturer, @Origin Method method) { (1) capturer.setPropertyName(getPropertyName(method)); (2) if (method.getReturnType() == byte.class) { (3) return (byte) 0; } else if ( ... ) { } // ... handle all primitve types // ... } else { return null; } } private static String getPropertyName(Method method) { (4) final boolean hasGetterSignature = method.getParameterTypes().length == 0 && method.getReturnType() != null; String name = method.getName(); String propName = null; if (hasGetterSignature) { if (name.startsWith("get") && hasGetterSignature) { propName = name.substring(3, 4).toLowerCase() + name.substring(4); } else if (name.startsWith("is") && hasGetterSignature) { propName = name.substring(2, 3).toLowerCase() + name.substring(3); } } else { throw new HibernateException( "Only property getter methods are expected to be passed"); (5) } return propName; } } 

рдЕрд╡рд░реЛрдзрди () рд╡рд┐рдзрд┐ рдХреЙрд▓ (1) рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдФрд░ рд▓рдХреНрд╖реНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред @Origin рдФрд░ @This рдЙрдкрдпреБрдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдмрд╛рдЗрдЯрдмрдбреНрдбреА рдПрдХ рдбрд╛рдпрдиреЗрдорд┐рдХ рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рд╕рд╣реА рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ () рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХреЗред

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

getPropertyName() (4) рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╣рдо рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рд╡рд┐рдзрд┐ рд╕рдВрджрд░реНрдн рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЧреБрдг рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ PropertyNameCapturer (2) рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╡рд┐рдзрд┐ рдПрдХ рдЧреЗрдЯрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреЛрдб рдПрдХ рдЕрдкрд╡рд╛рдж (5) рдлреЗрдВрдХрддрд╛ рд╣реИред рдЧреЗрдЯреНрдЯрд░ рдХрд╛ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ (3) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рд╢реВрдиреНрдп рд▓реМрдЯ рдЖрддреЗ рд╣реИрдВред

рдЕрдм рд╣рдо validateValue() рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ:

 public <T, P> Set<ConstraintViolation<T>> validateValue( Class<T> type, Function<? super T, P> property, P value) { T capturer = getPropertyNameCapturer(type); property.apply(capturer); String propertyName = ((PropertyLiteralCapturer) capturer).getPropertyName(); //      } 

рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрдирд╛рдП рдЧрдП рдкреНрд░реЙрдХреНрд╕реА рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЯрд╛рдЗрдк рдХрд░реЗрдВ PropertyNameCapturer рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдФрд░ рд╡рд┐рдзрд┐ рд╕реЗ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдЗрд╕рд▓рд┐рдП, рдмрд╛рдЗрдЯрдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рдХреБрдЫ рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рд╕рдВрдкрддреНрддрд┐ рд╢рд╛рдмреНрджрд┐рдХреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ 8 рд╕реЗ рд╡рд┐рдзрд┐ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

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

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ


рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЕрдиреНрдп рдЕрдЪреНрдЫреА рднрд╛рд╖рд╛рдПрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА (рдпрд╛ рд▓рдЧрднрдЧ) рдПрдХ рд╕рдорд╛рди рддрдВрддреНрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИрдВ:


рдпрджрд┐ рдЖрдк рдЕрдЪрд╛рдирдХ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рд▓реЛрдореНрдмреЛрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдЗрдЯрдХреЛрдб рд╕рдВрдХрд▓рди рд╕рдордп рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░, рдЖрдкрдХреЗ рд╡рд┐рдирдореНрд░ рд╕реЗрд╡рдХ рдиреЗ рдПрдХ рдЫреЛрдЯреА рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдирд╛рдо рд░рдЦрд╛, рдЬреЛ Java 8 рдХреЗ рд▓рд┐рдП nameOfProperty () рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ:

рд╕реНрд░реЛрдд рдХреЛрдб
рдмрд╛рдЗрдирд░реА

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


All Articles