2016-06-14 4 views
0

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! 

이 늘 일 :

+0

톰캣에서 일을 실행할 때 내 생각은 AspectJ의로드 시간 직물이 작동하지 않는 것입니다. 로드 타임 직조가 실제로 적용되는지 확인하고 구성 될 때까지 구성을 수정해야한다고 생각합니다. 또한 컴파일 타임 짜기를 사용하는 것을 고려해 볼 수 있습니다 (여러분은 maven을 사용하여이 작업을 수행 할 수 있고 Eclipse는 AspectJ 컴파일러도 사용할 수 있습니다). '@ Configurable'을 컴파일 타임 직조로 사용하여 큰 성공을 거두었습니다. '-javaagent'vm 인수로 Tomcat JVM을 실행 해보십시오. –

+0

또한, AspectJ 로딩 타임 위버에 대한 디버그 로깅을 활성화해야 실제로 작업 내용을 볼 수있다. 관련없는 질문에 대한 답변은 my [answer] (http://stackoverflow.com/a/35224749/2699901)를 참조하십시오. –

+0

@ NándorElődFekete. 핵심 프로젝트 자체가 작동하며 실행시 "Testing Aspect"출력을 볼 수 있습니다. 당신이 고려해야 할 두 가지, 나는 문제가되지 말아야하는 IntelliJ를 실행 중이며 -javaagent를 사용하는 바람둥이를 실행 중입니다. 디버그 로깅을 사용할 수있게 될 것이므로 업데이트를 제안 할 것입니다. 건배. – Gui

답변

0

주요 문제는 콩에 측면을 적용하는 것 같다. (domain.model에 있는지 확인하십시오.* 스프링 주석이 없습니다.) 아마도 여러분이 Sequence.java를 게시하면 충돌의 원인이 무엇인지 알 수 있습니다.

반면에 aspectj는 모델에만 할당되고 빈은 할당되지 않아야합니다. 그래서 당신은 당신의 POJO 모델을 포함하는 /META-INF/aop.xml 있는지 확인 : 내 pom.xml 파일의

<!DOCTYPE aspectj PUBLIC 
     "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
    <aspectj> 
     <weaver> 
      <!-- only weave classes in our application-specific packages --> 
      <include within="com.test.server.graph.domain.model.*" /> 
     </weaver> 
     <aspects> 
      <!-- weave in just this aspect --> 
      <aspect name="my.util.aspects.Neo4jFetchAspect" /> 
     </aspects> 
    </aspectj> 

부품 (내가 지금 다른 설정을 가지고는 - 봄 버전이 왜 그런지 이잖아 세) :

<dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>1.6.12</version> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>1.6.12</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aspects</artifactId> 
     <version>3.1.1.RELEASE</version> 
    </dependency> 

나는이 내 출력 모든 권장 제안을 적용하면

+0

답장을 보내 주셔서 감사합니다. 주 질문에서 클래스를 업데이트로 추가했습니다. @Configurable은 Spring Documentation에서 말하기 때문입니다. 이 모델에는 Neo4j 주석 (SDN4)이 있으며 LazyLoading을 적용하기 위해 LTW로 지정하려고합니다. 내 graphDB는 정말 거대합니다. 주어진 엔티티에 대해 모두 얻으면 영원히 지속됩니다. – Gui

+0

@Guilherme 구성 가능한 문제 일 수 있습니다. 나는 당신이 그것을 섞을 수 없다고 확신합니다. 특수 효과를 제거하고 봄 수업이이 수업에 들지 않도록하려면 어떻게해야합니까? – Niko

+0

NoSuchMethodError가 표시됩니다. pom.xml의 종속성은 무엇입니까? 또는 어떤 구성을 사용합니까? – Gui

0

유사한 특별한 빌드 플러그인 또는 필요 없다.

2016-06-15 09:15:21,144 INFO [localhost-startStop-1] DispatcherServlet: FrameworkServlet 'mvc-dispatcher': initialization started 
2016-06-15 09:15:21,166 INFO [localhost-startStop-1] XmlWebApplicationContext: Refreshing WebApplicationContext for namespace 'mvc-dispatcher-servlet': startup date [Wed Jun 15 09:15:21 BST 2016]; root of context hierarchy 
2016-06-15 09:15:21,198 INFO [localhost-startStop-1] XmlBeanDefinitionReader: Loading XML bean definitions from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml] 
2016-06-15 09:15:21,683 INFO [localhost-startStop-1] DefaultListableBeanFactory: Overriding bean definition for bean 'org.springframework.context.config.internalBeanConfigurerAspect' with a different definition: replacing [Root bean: class [org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=aspectOf; initMethodName=null; destroyMethodName=null] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration; factoryMethodName=beanConfigurerAspect; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/context/annotation/aspectj/SpringConfiguredConfiguration.class]] 
2016-06-15 09:15:21,866 INFO [localhost-startStop-1] PropertySourcesPlaceholderConfigurer: Loading properties file from class path resource [core.properties] 
2016-06-15 09:15:21,876 INFO [localhost-startStop-1] DefaultContextLoadTimeWeaver: Could not obtain server-specific LoadTimeWeaver: Could not initialize TomcatLoadTimeWeaver because Tomcat API classes are not available 
2016-06-15 09:15:21,877 INFO [localhost-startStop-1] DefaultContextLoadTimeWeaver: Found Spring's JVM agent for instrumentation 
[[email protected]] info AspectJ Weaver Version 1.8.9 built on Monday Mar 14, 2016 at 21:18:16 GMT 
[[email protected]] info register classloader [email protected] 

**[[email protected]] info using configuration /Users/SearchV2/content/target/classes/META-INF/aop.xml** 

**[[email protected]] info using configuration file:/Users/.m2/repository/org/springframework/spring-aspects/4.3.0.RELEASE/spring-aspects-4.3.0.RELEASE.jar!/META-INF/aop.xml** 

** REGISTERING MY ASPECT ** 
[[email protected]] info register aspect com.test.server.graph.aop.LazyFetchAspect 

PostProcessorRegistrationDelegate$BeanPostProcessorChecker: Bean 'neo4jConfig' of type [class com.test.server.graph.config.Neo4jConfig$$EnhancerBySpringCGLIB$$f406a5c8] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
2016-06-15 09:15:22,267 INFO [localhost-startStop-1] Neo4jConfiguration: Initialising PersistenceExceptionTranslationPostProcessor 
[[email protected]] weaveinfo Join point 'method-execution(java.lang.String com.test.server.graph.domain.model.DatabaseObject.getStId())' in Type 'com.test.server.graph.domain.model.DatabaseObject' (DatabaseObject.java:82) advised by around advice from 'com.test.server.graph.aop.LazyFetchAspect' (LazyFetchAspect.java) 

.... 더 많은 게터가 권장됩니다.

나는 다음과 같은 예외가 일부 쿼리를 수행 한 후 :

SEVERE: Servlet.service() for servlet [mvc-dispatcher] in context with path [] threw exception [Handler processing failed; nested exception is java.lang.NoSuchMethodError: com.test.server.graph.aop.LazyFetchAspect.aspectOf()Lcom/test/server/graph/aop/LazyFetchAspect;] with root cause 
java.lang.NoSuchMethodError: com.test.server.graph.aop.LazyFetchAspect.aspectOf()Lcom/test/server/graph/aop/LazyFetchAspect; 
    at com.test.server.graph.domain.model.DatabaseObject.getStId(DatabaseObject.java:82)