Tomcat에서 프로젝트를 실행하고 AspectJ Load Time Weaver를 사용하여 모델 (getters)을 잘라내어 짠 모든 것을 시도했다. 기본적으로, 나는 스프링 문서 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-atconfigurable의 모든 단계를 따랐다. 나는 또한 Lazy/Eager loading/fetching in Neo4j/Spring-Data과 같은 접근법을 따랐다. 내 프로젝트는 - core : spring-data-neo4j (저장소 및 구성), 전용 패키지의 도메인 모델, LoggingAspect 및 LazyLoadingAspect의 두 가지 주요 프로젝트로 나뉩니다. 추신. XML 파일의 구성을 사용하고 있지 않습니다. 주석을 순전히 사용하고 있습니다. - content : 핵심 프로젝트에 의존하는 Tomcat에서 실행되는 웹 응용 프로그램이며 도메인 프로젝트에서 getter 메서드를 호출 할 때 위빙하고 싶습니다.Spring 데이터를 사용하여 지연로드 Neo4j 4 + Tomcat에서 실행되는 AspectJ LTW
코어 자체를 실행하여 maven 플러그인을 사용하여 실행하고 aspectj에 대한 종속성을 추가 할 수있었습니다. 하지만 내가 Tomcat으로 이사하면 모든 지옥이 시작됩니다. 나는 모든 가능성은 사용자 정의의 context.xml을 생성, 바람둥이에 넣어 봄 악기/lib 폴더, 등 등 나는 다음과 같은 예외를 수신하고 -javaagent를 사용하여 예를 들어, 시도 :
java.lang.IllegalStateException: Post-processor tried to replace bean instance of type [com.test.server.graph.domain.model.Sequence] with (proxy) object of type [org.springframework.beans.factory.aspectj.$Proxy96] - not supported for aspect-configured classes! at org.springframework.beans.factory.wiring.BeanConfigurerSupport.checkExposedObject(BeanConfigurerSupport.java:173) at org.springframework.beans.factory.wiring.BeanConfigurerSupport.configureBean(BeanConfigurerSupport.java:143) at org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect.configureBean(AnnotationBeanConfigurerAspect.aj:63) at org.springframework.beans.factory.aspectj.AbstractDependencyInjectionAspect.ajc$afterReturning$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$2$1ea6722c(AbstractDependencyInjectionAspect.aj:88) at com.test.server.graph.domain.model.Sequence.(Sequence.java:29) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at org.neo4j.ogm.annotations.EntityFactory.instantiate(EntityFactory.java:135) at org.neo4j.ogm.annotations.EntityFactory.instantiateObjectFromTaxa(EntityFactory.java:110) at org.neo4j.ogm.annotations.EntityFactory.newObject(EntityFactory.java:61) at org.neo4j.ogm.context.GraphEntityMapper.mapNodes(GraphEntityMapper.java:147) at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:132) at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:107) at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:102) at org.neo4j.ogm.context.RestModelMapper.mapEntity(RestModelMapper.java:157) at org.neo4j.ogm.context.RestModelMapper.map(RestModelMapper.java:76) at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.query(ExecuteQueriesDelegate.java:94) at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.query(ExecuteQueriesDelegate.java:73) at org.neo4j.ogm.session.Neo4jSession.query(Neo4jSession.java:313) at org.springframework.data.neo4j.template.Neo4jTemplate.query(Neo4jTemplate.java:217) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) at com.sun.proxy.$Proxy58.query(Unknown Source)
의 pom.xml을 (코어 의 .project)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>${sdn.version}</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-core</artifactId>
<version>2.0.3-SNAPSHOT</version>
</dependency>
내 구성 클래스 (핵심 사업)
@org.springframework.context.annotation.Configuration
@ComponentScan(basePackages = "org.test.server.graph")
@EnableNeo4jRepositories(basePackages = "org.test.server.graph.repository")
@EnableAspectJAutoProxy
@EnableSpringConfigured
public class Neo4jConfig extends Neo4jConfiguration {
@Bean
public Configuration getConfiguration() {
Configuration config = new Configuration();
config.driverConfiguration().setDriverClassName("org.neo4j.ogm.drivers.http.driver.HttpDriver")
.setURI(System.getProperty("neo4j.host")).setCredentials(System.getProperty("neo4j.user"),System.getProperty("neo4j.password"));
return config;
}
@Bean
public SessionFactory getSessionFactory() {
return new SessionFactory(getConfiguration(), "org.test.server.graph.domain");
}
@Bean
@Scope(value = "prototype")
public Session getSession() throws Exception {
return super.getSession();
}
}
,536,913 봄 문서에서 권장하는대로 63,210
도메인 모델 클래스
나는
@Configurable 도메인 모델
MVC-디스패처 - 서블릿 (웹 애플리케이션 프로젝트)의 클래스를 주석
<context:spring-configured />
<context:load-time-weaver aspectj-weaving="on" weaver-class="org.springframework.instrument.classloading.tomcat.TomcatLoadTimeWeaver" />
나는 tomcat-maven-plugin과 tomcat 독립 실행 형 설치 (v7 및 v8)를 사용하여 실행을 시도했습니다.
- UPDATE -
Sequence.java
@NodeEntity
@Configurable
public class Sequence extends DatabaseObject {
@Relationship(type = "hasModifiedResidue", direction = Relationship.OUTGOING)
private List<AbstractModifiedResidue> hasModifiedResidue;
@Relationship(type = "referenceEntity", direction = Relationship.OUTGOING)
private ReferenceSequence referenceEntity;
public Sequence() {}
//getter and setters
}
DatabaseObject.java
@NodeEntity
@Configurable(
preConstruction = false
)
public abstract class DatabaseObject implements Serializable, Comparable<DatabaseObject> {
@GraphId
private Long id;
// other common attributes + getter and setters, no more annotation
LazyLoadingAspect
01 당신이 당신의 모델 클래스는 실제 POJO를하지 콩이며, 봄에서 제외 확인해야하므로,Post-processor tried to replace bean instance of type [com.test.server.graph.domain.model.Sequence] with (proxy) object of type [org.springframework.beans.factory.aspectj.$Proxy96] - not supported for aspect-configured classes!
이 늘 일 :
톰캣에서 일을 실행할 때 내 생각은 AspectJ의로드 시간 직물이 작동하지 않는 것입니다. 로드 타임 직조가 실제로 적용되는지 확인하고 구성 될 때까지 구성을 수정해야한다고 생각합니다. 또한 컴파일 타임 짜기를 사용하는 것을 고려해 볼 수 있습니다 (여러분은 maven을 사용하여이 작업을 수행 할 수 있고 Eclipse는 AspectJ 컴파일러도 사용할 수 있습니다). '@ Configurable'을 컴파일 타임 직조로 사용하여 큰 성공을 거두었습니다. '-javaagent'vm 인수로 Tomcat JVM을 실행 해보십시오. –
또한, AspectJ 로딩 타임 위버에 대한 디버그 로깅을 활성화해야 실제로 작업 내용을 볼 수있다. 관련없는 질문에 대한 답변은 my [answer] (http://stackoverflow.com/a/35224749/2699901)를 참조하십시오. –
@ NándorElődFekete. 핵심 프로젝트 자체가 작동하며 실행시 "Testing Aspect"출력을 볼 수 있습니다. 당신이 고려해야 할 두 가지, 나는 문제가되지 말아야하는 IntelliJ를 실행 중이며 -javaagent를 사용하는 바람둥이를 실행 중입니다. 디버그 로깅을 사용할 수있게 될 것이므로 업데이트를 제안 할 것입니다. 건배. – Gui