... рдЙрдирдХреЗ рдЪрд╛рд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╣реИрдВред
рд╡реНрд▓рд╛рджрд┐рдореАрд░ рдкреНрд▓рд┐рдЧреНрдЧреА ( рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ 2: рд╡реЗ рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ ) рдХреА рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░, рдореИрдВрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрде рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрдиреБрднрд╡, рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдЙрди рдиреБрдХрд╕рд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдореБрдЭреЗ рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдорд┐рд▓реЗ рдереЗред
рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬрдкрд╛
рд╡реНрд▓рд╛рджрд┐рдореАрд░ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрде 2 рдХреЗ рдкреНрд░рд╡рд╛рд╕ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИред рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рднреА рдЙрдирдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рд╡реЗрдпрд░рд╣рд╛рдЙрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рдЙрд╕рдХреЗ рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ - рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдПред рдЗрд╕ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдореБрдЦреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ - JpaRepository
, рд╕рдВрд╕реНрдХрд░рдгреЛрдВ 2 рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рд╣реИред * *ред
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдзрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ, рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 2 рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рджред * рдпреЗ рд╕рднреА рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗред
рдЬрдм рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрде 2 рдореЗрдВ рдкреНрд░рд╡рд╛рд╕рди рдХрд╛ рдореБрджреНрджрд╛ рдЙрдард╛рдпрд╛ рдФрд░ рдкрд╣рд▓рд╛ рдХрджрдо рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдерд╛ (pom.xml рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрдЧрд╣), рддреЛ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдЪрдореБрдЪ рд▓рд╛рд▓ рд╣реЛ рдЧрдИ рдереА: рджрд░реНрдЬрдиреЛрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рд╕реИрдХрдбрд╝реЛрдВ рдХреЙрд▓ рдиреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рдкреНрд░рд╡рд╛рд╕рди рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛ "(рдирдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рд╣рд░ рджреВрд╕рд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣реБрдХ рдХрд░реЗрдЧрд╛ред рд╕рд░рд▓рддрдо рдХреЛрдб рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:
SomeEntity something = someRepository.findOne(someId); if (something == null) { something = someRepository.save(new SomeEntity()); } useSomething(something);
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рд╕рд╛рде рдорд┐рд▓реЗрдВ, рдЖрдкрдХреЛ рдЬрд░реВрд░рдд рд╣реИ
- рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдУ
- рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ
something
Optional<SomeEntity>
Optional::isPresent
рд╕рд╛рде рдЦрд╛рд▓реА рд╕рдВрджрд░реНрдн рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ: Optional::isPresent
рдпрд╛ Optional::orElse
/ Optional::orElseGet
- рдкрд░реАрдХреНрд╖рдг рдареАрдХ рдХрд░реЗрдВ
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рджрд┐рдирд╛рдВрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрднреВрддрдкреВрд░реНрд╡ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╕рднреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрджрд┐ рд╡реЗ рдЕрднреА рддрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ) рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рд╡рд░реНрдЧ рдЬреЛ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рднреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдЖрдзрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рд╣рдорд╛рд░реЗ рд╕рднреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдВрдЧреЗред рдЕрдм рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
public class BaseJpaRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements BaseJpaRepository<T, ID> { private final JpaEntityInformation<T, ?> entityInfo; private final EntityManager entityManager; public BaseJpaRepositoryImpl(JpaEntityInformation<T, ?> entityInfo, EntityManager entityManager) { super(entityInfo, entityManager); this.entityInfo = entityInfo; this.entityManager = entityManager; } @Override public T findOne(ID id) { return findById(id).orElse(null);
рдмрд╛рдХреА рдЫрд╡рд┐ рдФрд░ рд╕рдорд╛рдирддрд╛ рдореЗрдВ рд╣реИред рд╕рднреА рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рдХреЛрдб рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ 2 рдХрдХреНрд╖рд╛рдПрдВ рдмрджрд▓реА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ 200 рдирд╣реАрдВред рдЕрдм рдЖрдк рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдПрдкреАрдЖрдИ рдХреЛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирдП рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдЗрдбрд┐рдпрд╛ рдзреНрдпрд╛рди рд╕реЗ рд╕рднреА рдХреЙрд▓ рдХреЛ @Deprecod рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред
рдЕрдВрддрд┐рдо рдЖрдШрд╛рдд - рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдм рд╕реЗ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдХреЛ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
@Configuration @EnableJpaRepositories(repositoryBaseClass = BaseJpaRepositoryImpl.class) public class SomeConfig{ }
рдПрдХ рд╢рд╛рдВрдд рдкреВрд▓ рдореЗрдВ, рдбрд┐рдмреНрдмреЗ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ
рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрде рджреЛ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ - рд╕реНрдЯрд╛рд░реНрдЯрд░ рдФрд░ рдСрдЯреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред рдЬреАрд╡рди рдореЗрдВ, рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдкрддреНрддрд┐ рд╣реИ - рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛ рдЖрд╡реЗрджрди рдХреЗ рд╡рд░реНрдЧрдкрде рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рд╡рд╣ рдПрд╕рдмреА рджреНрд╡рд╛рд░рд╛ рд╕реНрдХреИрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдХреЛрдИ рд╡рд░реНрдЧ рдЗрд╕рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯрд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рдЬреНрдЮрд╛рди рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред
рдХрдИ GSON рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ JSON рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рдмрджрд▓рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдЕрдХреНрд╕рд░ рдЗрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
@Component public class Serializer { public <T> String serialize(T obj) { return new Gson().toJson(obj); } }
рд▓рдЧрд╛рддрд╛рд░ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде, рдпрд╣ рдХреЛрдб рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛, рдЬреЛ рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдорд╛рд░реНрдЯ рд▓реЛрдЧ рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
@Configuration public class SomeConfig { @Bean public Gson gson() { return new Gson(); } } @Component @RequiredArgsConstructor public class Serializer { private final Gson gson; public String serialize(T obj) { return gson.toJson(obj); } }
... рдпрд╣ рднреА рдПрд╣рд╕рд╛рд╕ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрде рдЦреБрдж рд╕рдм рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрд╕рдмреА org.springframework.boot:spring-boot-autoconfigure
рд╕рд╛рде рдЖрддрд╛ рд╣реИ org.springframework.boot:spring-boot-autoconfigure
рдирд┐рд░реНрднрд░рддрд╛, рдЬрд┐рд╕рдореЗрдВ *AutoConfiguration
рдирд╛рдордХ рдХрдИ рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣:
@Configuration @ConditionalOnClass(Gson.class) @EnableConfigurationProperties(GsonProperties.class) public class GsonAutoConfiguration { @Bean @ConditionalOnMissingBean public GsonBuilder gsonBuilder(List<GsonBuilderCustomizer> customizers) { GsonBuilder builder = new GsonBuilder(); customizers.forEach((c) -> c.customize(builder)); return builder; } @Bean @ConditionalOnMissingBean public Gson gson(GsonBuilder gsonBuilder) { return gsonBuilder.create(); } }
рдПрдХ рд░реЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧ рд╕рд░рд▓ рд╣реИ: рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ Gson
рд╡рд░реНрдЧ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдмреАрди рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдПрдХ рдЬрдмрд░рджрд╕реНрдд рд╢рдХреНрддрд┐ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдХреБрдЫ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╡рд░реНрдгрди XML рд╢реАрдЯ рдФрд░ рдХрдИ рд╣рд╕реНрддрд▓рд┐рдЦрд┐рдд рдбрд┐рдмреНрдмреЗ рд▓реЗрддреЗ рдереЗред
рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рдкрд░рд┐рд╖рдж рдХреА рдПрдХ рдмрдбрд╝реА рдЬрд┐рдж рд╣реИред рдХрдкрдЯреАрдкрди рдЧреБрдкреНрддрддрд╛ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рдо рдкреВрд░реНрд╡ рд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реБрдб рдХреЗ рддрд╣рдд рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреАрдЯрд╛ рдЯреНрд░реИрдХ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ - рдмрд┐рдирд╛ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдХрд╛рдлрд┐рд▓рд╛ рдЧреЛрд▓реА рдорд╛рд░рддрд╛ рд╣реИред рдХрдИ рд╕реЗрдо рд╣рдорд╛рд░реЗ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЧреНрд╕рди рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд╡рд░реНрдЧ рдФрд░ рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, ...
рдЖрдкрдХреЗ рд╡рд░реНрдЧрдкрде рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдЖрддрд╛ рд╣реИ рд╡рд╣ рдЖрдкрдХреЗ рдЦрд┐рд▓рд╛рдл рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬреАрд╡рди рд╕реЗ рдПрдХ рдорд╛рдорд▓рд╛ред рджреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИрдВ: рдПрдХ LdapTemplate
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рджреВрд╕рд░реЗ рдиреЗ рдПрдХ рдмрд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рджреЛрдиреЛрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧ core
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХрдХреНрд╖рд╛рдПрдВ рдирд┐рдХрд╛рд▓реА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рджреЛрдиреЛрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ pom.xml рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдореЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рджреВрд╕рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ, LdapTemplate
рд╕рднреА рдЙрдкрдпреЛрдЧ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ LdapTemplate
рдЧрдПред рд▓реЗрдХрд┐рди org.springramework:spring-ldap
рд▓рд╛рдЗрдмреНрд░реЗрд░реА core
рдореЗрдВ рдмрдиреА рд░рд╣реАред рдлрд┐рд░ SB рдиреЗ рдорд╛рд░рд╛ рдФрд░ org.springramework.ldap:ldap-core
org.springramework.boot:spring-boot-starter-data-ldap
рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ org.springramework.boot:spring-boot-starter-data-ldap
ред
рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд▓реЙрдЧ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджрд┐рдП:
Multiple Spring Data modules found, entering strict repository configuration mode! Spring Data LDAP - Could not safely identify store assignment for repository candidate interface ....
core
рдиреЗрддреГрддреНрд╡ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ред org.springramework.boot:spring-boot-starter-data-ldap
рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдлрд┐рдЯ org.springramework.boot:spring-boot-starter-data-ldap
рдЬрд┐рд╕рдореЗрдВ LDAP рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдХреЛрдЪ рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдХреНрд▓рд╛рд╕рдкрд╛рда рдХреЛ рдорд╛рд░реЛ :)ред рдЖрдЧреЗ рд╕рднреА рдкрдбрд╝рд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде:
- рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдиреЛрдЯрд┐рд╕
org.springramework.boot:spring-boot-starter-data-ldap
рдХреНрд▓рд╛рд╕рдкрд╛рде рдореЗрдВ org.springramework.boot:spring-boot-starter-data-ldap
- рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЕрдм рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ JPA рдпрд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ LDAP рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ
- рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдкреБрдирд░реНрдЧрдарди рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ
org.springramework.boot:spring-boot-starter-data-ldap
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕рдордп рдХреЛ 20 рдХреА рдФрд╕рдд (40 рд╕реЗрдХрдВрдб) рд╕реЗ рдШрдЯрд╛рдХрд░ рдХреБрд▓ 40-50 рддрдХ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ!
рдПрдХ рдЪреМрдХрд╕ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╛рдардХ рд╢рд╛рдпрдж рдкреВрдЫреЗрдЧрд╛: рдЖрдкрдХреЛ org.springramework.ldap:ldap-core
рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдереА org.springramework.ldap:ldap-core
рд╕реЗ org.springramework.boot:spring-boot-starter-data-ldap
рдЕрдЧрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ LDAP рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ class org.springframework.ldap.LdapTempate
?
рдЙрддреНрддрд░: рдпрд╣ рдПрдХ рдЧрд▓рддреА рдереАред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрд╕реНрдХрд░рдг 2.1.0.M1 рд╕реЗ рдкрд╣рд▓реЗ, LDAP рдХреЗ рд▓рд┐рдП рдСрдЯреЛ-рдЯреНрдпреВрдирд┐рдВрдЧ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рдереА
@Configuration @ConditionalOnClass({ContextSource.class}) @EnableConfigurationProperties({LdapProperties.class}) public class LdapAutoConfiguration { private final LdapProperties properties; private final Environment environment; public LdapAutoConfiguration(LdapProperties properties, Environment environment) { this.properties = properties; this.environment = environment; } @Bean @ConditionalOnMissingBean public ContextSource ldapContextSource() { LdapContextSource source = new LdapContextSource(); source.setUserDn(this.properties.getUsername()); source.setPassword(this.properties.getPassword()); source.setBase(this.properties.getBase()); source.setUrls(this.properties.determineUrls(this.environment)); source.setBaseEnvironmentProperties(Collections.unmodifiableMap(this.properties.getBaseEnvironment())); return source; } }
LdapTemplate
рдХрд╣рд╛рдВ рд╣реИ? рд▓реЗрдХрд┐рди рд╡рд╣ :) рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, рдпрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рдФрд░ рдирд┐рд╣рд┐рдд рд╣реИ:
@Configuration @ConditionalOnClass({LdapContext.class, LdapRepository.class}) @AutoConfigureAfter({LdapAutoConfiguration.class}) public class LdapDataAutoConfiguration { @Bean @ConditionalOnMissingBean({LdapOperations.class}) public LdapTemplate ldapTemplate(ContextSource contextSource) { return new LdapTemplate(contextSource); } }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдзрд╛рд░рдгрд╛ рдмрдирд╛рдИ рдЧрдИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ LdapTemplate
рдХреЛ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ LdapTemplate
рд╣реИрдВ @ConditionalOnClass({LdapContext.class, LdapRepository.class})
, рдЬреЛ рддрдм рд╕рдВрднрд╡ рд╣реИ рдЬрдм spring-boot-starter-data-ldap
@ConditionalOnClass({LdapContext.class, LdapRepository.class})
spring-boot-starter-data-ldap
рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдХреНрд▓рд╛рд╕рдкрд╛рде рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рдирд╛: рдЗрд╕ рдмреАрди рдХреЛ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕реЗ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ SB рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ)ред org.springramework.boot:spring-boot-starter-data-ldap
org.springramework.ldap:ldap-core
org.springramework.boot:spring-boot-starter-data-ldap
рдХреЛ org.springramework.ldap:ldap-core
рдЬрдЧрд╣ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж org.springramework.boot:spring-boot-starter-data-ldap
рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдПред
рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://github.com/spring-projects/spring-boot/pull/13136 ред рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди: LdapTemplate
рдмреАрди LdapTemplate
LdapAutoConfiguration
рд▓рд┐рдП рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ред рдЕрдм рдЖрдк spring-boot-starter-data-ldap
LdapTemplate
рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд┐рдП рдмрд┐рдирд╛ рдПрд▓рдбреАрдПрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ LdapTemplate
рдмрд┐рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ LdapTemplate
ред
рд╣реБрдб рдХрд╛ рдЙрдкрджреНрд░рд╡
рдпрджрд┐ рдЖрдк рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдУрдкрди-рдЗрди-рд╡реНрдпреВ рдПрдВрдЯреАрдкреИрдЯрд░реНрди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рд╣рдо рдЗрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗ, рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдорд╣рд╛рди рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рдореЛрдб рдХреЛ рдЪрд╛рд▓реВ / рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдзреНрд╡рдЬ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
spring: jpa: open-in-view: true
рдПрд╕рдмреА рд╕рдВрд╕реНрдХрд░рдг 1 рдореЗрдВред * рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдерд╛, рдЬрдмрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ 2. * рдпрд╣ рдЕрднреА рднреА рд╕рдХреНрд╖рдо рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд▓рд┐рдЦреА рдЧрдИ рд╣реИ:
WARN spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning.
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЗрд╕ рд╡рд┐рдзрд╛ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдорд╣рд╛рдХрд╛рд╡реНрдп рд╕рд╛рд░ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рд╕рд╣рд┐рдд рдХрдИ рджрд░реНрдЬрдиреЛрдВ (!) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдУрд▓рд┐рд╡рд░ рд╣реЛрд░реНрдХреЗ (рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯ рдбреЗрд╡рд▓рдкрд░), рд╡реНрд▓рд╛рдж рдорд╛рдЗрдХрд▓реЗ (рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдбреЗрд╡рд▓рдкрд░), рдлрд┐рд▓ рд╡реЗрдм рдФрд░ рд╡реЗрджрд░рд╛рди рдкрд╡рд┐рдХ (рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕) рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рджреНрд╡рд╛рд░рд╛ред
рд╡реЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рд╣рдордд рдереЗ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреА (рдЬреЛ рджреЗрдЦреА рдЧрдИ рд╣реИ)ред рдЗрд╕ рдореЛрдб рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдЯрд┐рдк рднреА рд╣реИ:
spring: jpa: open-in-view: false
рдмрд╕ рдЗрддрдирд╛ рд╣реА, рд╕реБрд░рдХреНрд╖рд╛ рдкрд░рд┐рд╖рдж рдХреА рдЕрдкрдиреА рд░реЗрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреЗрдВ - рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЯреВрдЯ рд╡рд┐рд╖рдп рд╣реИред