[SPRING] @ Configurable-Beans는 Spring Boot에서 JPA-EntityListeners와 함께 작동하지 않습니다.
SPRING@ Configurable-Beans는 Spring Boot에서 JPA-EntityListeners와 함께 작동하지 않습니다.
나는 스프링 부트 애플리케이션에서 만든 커스텀 jpa-entity 리스너에 이상한 문제가있다. Spring @Configurable 메커니즘을 사용하여 (Spring AuditingEntityListener에서 볼 수 있듯이) EntityListener를 구성하려하지만 Spring은 jpa 엔터티의 @ EntityListeners-Annotation에서 사용되는 즉시 Listener를 인식하지 않습니다. jpa 엔티티에 구성되어 있지 않으면 Listener는 스프링에 의해 유선 / 구성됩니다.
문제를 설명하기 위해 junit-test로 예제 프로젝트를 만들었습니다. https://github.com/chrisi/aopconfig/find/master
@SpringBootApplication
@EnableSpringConfigured
@EnableLoadTimeWeaving
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
EntityListener :
/**
* This bean will NOT be instanciated by Spring but it should be configured by Spring
* because of the {@link Configurable}-Annotation.
* <p>
* The configuration only works if the <code>UnmanagedBean</code> is not used as an <code>EntityListener</code>
* via the {@link javax.persistence.EntityListeners}-Annotation.
*
* @see FooEntity
*/
@Configurable
public class UnmanagedBean {
@Autowired
private ManagedBean bean;
public int getValue() {
return bean.getValue();
}
}
Bean Entity Listener / Unmanaged Bean에 주입하고 싶습니다.
/**
* This bean will be instanciated/managed by Spring and will be injected into the
* {@link UnmanagedBean} in the case the <code>UnmanagedBean</code> is not used as an JPA-EntityListener.
*/
@Component
@Data
public class ManagedBean {
private int value = 42;
}
리스너가 사용되어야하는 엔티티 :
/**
* This simple entity's only purpose is to demonstrate that as soon as
* it is annotated with <code>@EntityListeners({UnmanagedBean.class})</code>
* springs configurable mechanism will not longer work on the {@link UnmanagedBean}
* and therefore the <code>ConfigurableTest.testConfigureUnmanagedBean()</code> fails.
*/
@Entity
@EntityListeners({UnmanagedBean.class}) // uncomment to make the test fail
public class FooEntity {
@Id
private Long id;
private String bar;
}
마지막으로 Listener가 사용되는 즉시 배선이 작동하지 않는다는 것을 보여주는 테스트 :
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class ConfigurableTest {
/**
* This test checks if the ManagedBean was injected into the UnmanagedBean
* by Spring after it was created with <code>new</code>
*/
@Test
public void testConfigureUnmanagedBean() {
UnmanagedBean edo = new UnmanagedBean();
int val = edo.getValue();
Assert.assertEquals(42, val);
}
}
junit-test (EntityListener / ManagedBean의 배선)는 FooEntity의 @EntityListeners ({UnmanagedBean.class}) 주석이 활성화됩니다.
이 버그입니까 아니면 다른 것을 놓쳤습니까?
테스트를 실행하려면 명령 줄에서 -javaagent : spring-instrument-4.1.6.RELEASE.jar을 사용해야하고 작업 디렉토리에 jar 파일을 제공해야합니다.
이것은 이전에 물어 본 "응축 된"버전입니다. @Configurable은 SpringBoot 응용 프로그램에서 인식되지 않습니다.
해결법
from https://stackoverflow.com/questions/31205852/configurable-beans-not-working-with-jpa-entitylisteners-in-spring-boot by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Autowired .. 하나 이상? (0) | 2019.04.27 |
---|---|
[SPRING] 관리 속성의 getter를 호출 할 때 NPE (0) | 2019.04.26 |
[SPRING] mockMvc를 사용하여 응답 본문에서 JSON을 확인하는 방법 (0) | 2019.04.26 |
[SPRING] 주석만을 사용하여 Spring AOP로 인터셉트하기 (0) | 2019.04.26 |
[SPRING] URL (Spring, REST, CXF)에서 이스케이프 문자 (파이프 |)를 처리하는 방법? (0) | 2019.04.26 |