복붙노트

[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