gpt4 book ai didi

tomcat - 使用在 Tomcat 上运行的 Spring Data Neo4j 4 + AspectJ LTW 进行延迟加载

转载 作者:行者123 更新时间:2023-11-28 23:25:30 25 4
gpt4 key购买 nike

我经历了所有尝试使我的项目在 Tomcat 上运行的可能性,并切入模型( setter/getter )并使用 AspectJ Load Time Weaver 编织它们。基本上,我遵循了 Spring 文档中的所有步骤 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-atconfigurable .我也遵循了同样的方法提到 Lazy/Eager loading/fetching in Neo4j/Spring-Data .我的项目分为两个主要项目: - 核心:spring-data-neo4j(存储库和配置)、专用包中的域模型、LoggingAspect 和 LazyLoadingAspect。附:我没有在 XML 文件中使用任何配置。我纯粹是在使用注释。 - 内容:运行在 Tomcat 上的 Web 应用程序依赖于核心项目,我想在域项目中调用 getter 方法时进行编织。

运行核心本身我设法让它运行使用 maven 插件并添加 aspectj 的依赖项。但是当我搬到 Tomcat 时,一切都开始了。我尝试了所有的可能性,例如使用 -javaagent,创建自定义 context.xml,将 spring-instrument 放入 tomcat/lib 文件夹等。我收到以下异常:

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 (core.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();
}
}

领域模型类

根据 Spring 文档的建议,我在域模型中注释了类

@Configurable

mvc-dispatcher-servlet(webapp 项目)

<context:spring-configured />
<context:load-time-weaver aspectj-weaving="on" weaver-class="org.springframework.instrument.classloading.tomcat.TomcatLoadTimeWeaver" />

我尝试使用 tomcat-maven-plugin 和 tomcat 独立安装(v7 和 v8)运行。

-- 更新--

序列.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

}

数据库对象.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

延迟加载方面

@Aspect
@Component
public class LazyFetchAspect {

@Autowired
private Neo4jOperations neo4jTemplate;

@Around("modelGetter()")
public Object autoFetch(ProceedingJoinPoint pjp) throws Throwable {
System.out.println(" Testing Aspect ");

return pjp.proceed();
}

@Pointcut("execution(public * com.test.server.graph.domain.model.*.get*(..))")
public void modelGetter() {
}
}

最佳答案

主要问题似乎是您正在将方面应用于 bean:

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!

这行不通,因此您必须确保您的模型类是真正的 POJO 而不是 beans,并将它们从 spring 中排除。 (确保在 domain.model.* 中没有 spring 注释)- 也许如果你发布你的 Sequence.java 我可以看到可能导致冲突的原因。

另一方面,您必须确保 aspectj 仅分配给模型,而不分配给任何 bean。因此,请确保您有一个仅包含您的 pojo 模型的/META-INF/aop.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>

我的 pom.xml 的一部分(我现在有一个不同的设置 - 这就是为什么 spring 版本这么旧):

    <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>

我没有任何特殊的构建插件或类似的

关于tomcat - 使用在 Tomcat 上运行的 Spring Data Neo4j 4 + AspectJ LTW 进行延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37807707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com