当我试图保存ManyToMany关系时,我得到一个数据库异常:
Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "INVERSES_ID"; SQL statement:
INSERT INTO m2m_owner_inverse (inverses_ID, owners_ID) VALUES (?, ?) [23502-184]
Error Code: 23502
Call: INSERT INTO m2m_owner_inverse (inverses_ID, owners_ID) VALUES (?, ?)
bind => [null, 1]
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为我在日志中看到插入了两个实例:
[EL Fine]: sql: 2016-02-22 13:18:32.67--ClientSession(1546269015)--Connection(1894667608)--INSERT INTO M2MOWNER (NAME) VALUES (?)
bind => [null]
[EL Fine]: sql: 2016-02-22 13:18:32.676--ClientSession(1546269015)--Connection(1894667608)--CALL IDENTITY()
[EL Fine]: sql: 2016-02-22 13:18:32.716--ClientSession(1546269015)--Connection(1894667608)--INSERT INTO M2MINVERSE (NAME) VALUES (?) …Run Code Online (Sandbox Code Playgroud) 我在Tomcat 6 webapp中使用Spring进行加载时编织时遇到了一些问题.我只想将它用于事务(因此自我调用遵循事务注释,而不是AOP代理).似乎正在加载织布工,但我的注释类实际上并没有被编织.当我单步执行代码时,我在SQL日志中看不到任何事务边界,正如我在常规AOP代理配置中看到的那样.这是我的设置:
在server.xml中:
<Context path="/api" allowLinking="true" reloadable="false" docBase="/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT" workDir="/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT/work">
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
Run Code Online (Sandbox Code Playgroud)
我有tom-tomcat-weaver.jar tomcat/lib目录,以及我的Tomcat类路径上的以下jar:
tomcat/webapps/API/ROOT/WEB-INF/lib/aspectjweaver.jar tomcat/webapps/API/ROOT/WEB-INF/lib/spring-aspects.jar
这是在bean配置文件中定义带注释的服务类:
<tx:annotation-driven transaction-manager="txManager" mode="aspectj"/>
Run Code Online (Sandbox Code Playgroud)
在我的上下文中的许多其他bean配置文件之一:
<aop:aspectj-autoproxy>
<aop:include name="methodTimer"/>
</aop:aspectj-autoproxy>
<context:load-time-weaver aspectj-weaving="on"/>
<context:annotation-config />
<bean name="methodTimer" class="tv.current.web.aop.MethodTimer" />
Run Code Online (Sandbox Code Playgroud)
我希望MethodTimer使用常规AOP代理,而不是LTW - LTW应该仅适用于@Transactional注释.如下所述:http://static.springsource.org/spring/docs/2.5.x/reference/aop.html#aop-aj-configure.如果我注释掉<aop:aspectj-autoproxy>元素,我不会得到任何我看到的编织信息日志消息.说到这里,他们在这里; 你可以看到方面正在加载,但实际上没有任何东西被编织:
Aug 28, 2009 6:34:42 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
[TomcatInstrumentableClassLoader@34fe7e0e] info AspectJ Weaver Version 1.6.5 built on Thursday Jun 18, 2009 at 03:42:32 GMT
[TomcatInstrumentableClassLoader@34fe7e0e] info register classloader org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader@34fe7e0e
[TomcatInstrumentableClassLoader@34fe7e0e] info using configuration …Run Code Online (Sandbox Code Playgroud) 是否有人成功使用带有签名的jar的AspectJ加载时编织?
我有一个例外,不知道如何解决它(使用AspectJ 1.6.8-16.10测试):
Exception in thread "main" java.lang.NoClassDefFoundError: com/package/clazz$AjcClosure1
at com.package.test.main(test.java:55)
Caused by: java.lang.ClassNotFoundException: com.package.clazz$AjcClosure1
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
... 1 more
Run Code Online (Sandbox Code Playgroud)
坦率地说,事件我不确定它是否在技术上可行,但我知道类似的问题(使用来自已签名的java类的动态生成的java代码)是为Hibernate项目完成的(即使用Javassist而不是CGLIB).细节在这里.
我正在寻找一种Java解决方案,它允许我在运行时使用AOP在已经运行的代码之上编写新代码.关键是不要求重启JVM.另外,我想在运行时删除编织,让旧代码在编织之前运行.
我在想AspectJ加载时编织+运行时类加载/卸载会做到这一点.有人试过吗?有什么建议?谢谢.
根据我的理解,为了使用aop.xml文件进行加载时间编织,它必须放在META-INF中.有没有办法绕过这个并在任何目录中使用aop.xml(或任何xml文件)?谢谢.
我使用的是Spring 3.2.9,Tomcat 6.0.44
我正在尝试配置我的应用程序的Spring检测提供程序(例如spring-instrumentation.jar)进行加载时编织,当它部署在Tomcat上时.
我要求不要在命令行上使用"-javaagent:/path/path/spring-instrument.jar"来进行配置.
我已经读过,我可以通过修改应用程序的Tomcat配置的<Context>元素来配置Spring检测(在Tomcat的server.xml或我的web应用程序的context.xml中).将适当的<Context>元素添加到server.xml会导致我的应用程序正确配置为与Spring的检测提供程序一起运行.将它添加到context.xml(见下文)不会导致工作设置.
我有一个META-INF/aop.xml文件,如下所示:
<aspectj>
<weaver options="-verbose -showWeaveInfo -debug">
<include within="com.mv.xx.services..*"/>
<exclude within="com.mv.xx.aop..*"/>
</weaver>
<aspects>
<aspect name="com.mv.xx.aop.MyAspect"/>
</aspects>
</aspectj>
Run Code Online (Sandbox Code Playgroud)
我还指定我想通过将其添加到我的Spring上下文配置来使用加载时编织:
<context:load-time-weaver />
Run Code Online (Sandbox Code Playgroud)
我将这个jar添加到我的应用程序的类路径:spring-instrument-tomcat.jar
我做了什么:
启动Tomcat时,如果我使用-javaagent参数在命令行上识别spring-instrument.jar的位置,如下所示:
-javaagent:/path/path2/spring-instrument-3.2.9.RELEASE.jar
Run Code Online (Sandbox Code Playgroud)
一切正常.
接下来,我从命令行中删除了"-javaagent:/path/path2/spring-instrument-3.2.9.RELEASE.jar".在Tomcat的server.xml文件(位于$ CATALINE_HOME/conf中)中,我向<Host>元素添加了一个<Context>元素,如下所示:
<Context path="/myApp" docBase="myApp">
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
Run Code Online (Sandbox Code Playgroud)
使用此配置,一切都正常.但是我要求不修改Tomcat的server.xml,因为我无法控制server.xml(DevOps会这样做,并且不愿修改它).
接下来,我从Tomcat的server.xml中删除了<Context>元素.根据Spring文档,我可以在我的webapp中添加/META-INF/context.xml,并将以前在Tomcat的server.xml中的<Context>元素放入context.xml中,如下所示:
<Context>
<Context path="/myApp" docBase="myApp">
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
</Context>
Run Code Online (Sandbox Code Playgroud)
但是,当我重新启动Tomcat时,我在日志中收到一条错误消息:
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.context.weaving.AspectJWeavingEnabler#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating …Run Code Online (Sandbox Code Playgroud) 我构建了一个简单的应用程序,它在服务器端使用Spring Data 3.1.0.RELEASE和Eclipselink 2.4 - 它托管在Tomcat 7.0.27中.在mywebapp/META-INF/context.xml中,我有Spring类加载器
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
Run Code Online (Sandbox Code Playgroud)
如果我把spring-instrument-tomcat.jar成$TOMCAT_HOME/lib则在Tomcat运行mywebapp很好,但如果我把spring-instrument-tomcat.jar进$TOMCAT_HOME/webapps/mywebapp/WEB-INF/lib- Tomcat的,出现异常死亡
java.lang.IllegalStateException: ClassLoader [org.apache.catalina.loader.WebappClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar
Run Code Online (Sandbox Code Playgroud)
Context loader参数useSystemClassLoaderAsParent设置false也没有帮助.
我不想在Tomcat中拥有任何(自定义)全局库(在现实生产系统中使用全局库并不容易)因此我试图将所有需要的东西本地化(简单)但是很大的战争档案.有关如何实现这种封装的任何想法?
tomcat classloader context.xml load-time-weaving spring-data
我知道 Spring 避免使用-javaagentvm 选项来使其 AspectJ 加载时间编织工作,而是依赖类加载器来启动代理。
我认为 Java 规范规定使用 Java 代理的唯一方法是通过-javaagentvm 选项。
我错了吗?有人可以将我引导到官方 Java 规范/文档来澄清我的审讯吗?
谁能告诉我为什么在使用弹簧靴时不会触发方面?我正在尝试使用 aspectj 设置加载时间编织,以便我可以建议私有方法。
这是准系统项目的链接 - https://github.com/satb/spring_aop_test_project.git
使用“-javaagent:path/to/spring-instrument-4.1.0.RELEASE.jar”(或计算机上其他版本的lib)运行“App”类并运行curl命令
curl -i http://localhost:8080/test-app/motd
Run Code Online (Sandbox Code Playgroud)
MyAspect 类有一个建议,应该在调用 MyService 的私有方法时执行。但在这种情况下,什么也不会发生。
但是,当应用程序启动时,我看到如下消息:
[AppClassLoader@58644d46] warning javax.* types are not being woven because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified.
Run Code Online (Sandbox Code Playgroud)
我尝试按照这里的建议让它工作,但这没有帮助 -将 @Autowired 与 AspectJ 和 Springboot 一起使用
我设置了 spring 应用程序。一切正常。但是当我将 Hibernate AvailableSettings.USE_CLASS_ENHANCER 属性设置为 true 时,我得到java.lang.ClassCircularityError.
这是我的配置。首先,我使用的是 log4j2。这是我的 log4j2 文件。
log4j-xinclude-appenders.xml:
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="WroxFileAppender" fileName="${filename}.log" filePattern="${filename}-%d{MM-dd-yyyy}-%i.log">
<PatternLayout pattern= "%d{HH:mm:ss.SSS} [%t] %X{id} %X{username} %-5level %c{36} %l: %msg%n" />
<Policies>
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy min="1" max="4" />
</RollingFile>
</appenders>
Run Code Online (Sandbox Code Playgroud)
log4j-xinclude-loggers.xml:
<loggers>
<root level="warn">
<!--
<appender-ref ref="Console" />
<appender-ref ref="WroxFileAppender" />
-->
</root>
<logger name="my.package" level="info" />
<logger name="org.apache" level="info" />
<logger name="org.springframework" level="info" />
<logger …Run Code Online (Sandbox Code Playgroud) spring-mvc hibernate-entitymanager maven-3 load-time-weaving tomcat8
aop ×5
aspectj ×5
java ×5
spring ×3
tomcat ×3
context.xml ×2
spring-aop ×2
classloader ×1
eclipselink ×1
javaagents ×1
jpa ×1
maven-3 ×1
runtime ×1
spring-boot ×1
spring-data ×1
spring-mvc ×1
tomcat8 ×1
transactions ×1