2017-10-27 6 views
0

restTemplateのために@Retryable注釈を使用したいと思います。私は次のように追加しました:Spring再試行可能な注釈ClassNotFoundException

@EnableRetryをconfigクラスに追加しました。

@Retryable(maxAttempts=4,value=Exception.class,[email protected](delay = 2000)) 

(新しいスレッド内)で

restTemplate.exchange(url, HttpMethod.POST, request, String.class); 

しかし、私はカタリナからエラーを取得しています:私は、メソッドをマークした

27-Oct-2017 18:11:41.023 SEVERE [http-nio-8080-exec-1] org.apache.catalina.core.StandardContext.listenerStart 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.aop.config.internalAutoProxyCreator': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around 
    at 
<ommitted> 
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1103) 
    ... 61 more 
Caused by: java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around 
    at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.<clinit>(ReflectiveAspectJAdvisorFactory.java:76) 
    at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.<init>(AnnotationAwareAspectJAutoProxyCreator.java:53) 
    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:423) 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142) 
    ... 63 more 
Caused by: java.lang.ClassNotFoundException: org.aspectj.lang.annotation.Around 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285) 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119) 
    ... 70 more 

27-Oct-2017 18:11:41.038 INFO [http-nio-8080-exec-1] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext 

私が間違ってやっていますか?

EDITED: 少し前に移動しました。 Spring Retry makes use of AOPので、私が追加することを発見:

27-Oct-2017 21:11:12.071 SEVERE [http-nio-8088-exec-5] org.springframework.web.servlet.DispatcherServlet.initServletBean Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController' defined in file [(...)\HomeController.class]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.springframework.aop.framework.ObjenesisCglibAopProxy 
    <ommitted> 
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.springframework.aop.framework.ObjenesisCglibAopProxy 
    at org.springframework.aop.framework.DefaultAopProxyFactory.createAopProxy(DefaultAopProxyFactory.java:60) 
    at org.springframework.aop.framework.ProxyCreatorSupport.createAopProxy(ProxyCreatorSupport.java:105) 
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:109) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:468) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:349) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:298) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:421) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1558) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    ... 35 more 

が、私は小さなspringMVCプロジェクトを作成した問題を特定し、それは同じです:

<dependency> 
    <groupid>org.springframework</groupid> 
    <artifactid>spring-aop</artifactid> 
    <version>4.2.5.RELEASE</version> 
</dependency> 
<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjweaver</artifactId> 
    <version>1.8.8</version> 
</dependency> 

は今、私は別のエラーを取得しています。すべてをシンプルに保つためには、わずかな依存関係しか使用しません。これは mvn dependency:treeから出力されます:

[INFO] com.example:store:war:0.0.1-SNAPSHOT 
[INFO] +- org.springframework:spring-webmvc:jar:4.0.3.RELEASE:compile 
[INFO] | +- org.springframework:spring-beans:jar:4.0.3.RELEASE:compile 
[INFO] | +- org.springframework:spring-context:jar:4.0.3.RELEASE:compile 
[INFO] | +- org.springframework:spring-core:jar:4.0.3.RELEASE:compile 
[INFO] | | \- commons-logging:commons-logging:jar:1.1.3:compile 
[INFO] | +- org.springframework:spring-expression:jar:4.0.3.RELEASE:compile 
[INFO] | \- org.springframework:spring-web:jar:4.0.3.RELEASE:compile 
[INFO] +- javax.servlet:jstl:jar:1.2:compile 
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided 
[INFO] +- org.springframework.retry:spring-retry:jar:1.2.1.RELEASE:compile 
[INFO] +- com.mashape.unirest:unirest-java:jar:1.4.9:compile 
[INFO] | +- org.apache.httpcomponents:httpasyncclient:jar:4.1.1:compile 
[INFO] | | +- org.apache.httpcomponents:httpcore:jar:4.4.4:compile 
[INFO] | | \- org.apache.httpcomponents:httpcore-nio:jar:4.4.4:compile 
[INFO] | +- org.apache.httpcomponents:httpmime:jar:4.5.2:compile 
[INFO] | \- org.json:json:jar:20160212:compile 
[INFO] +- org.springframework:spring-aop:jar:4.2.5.RELEASE:compile 
[INFO] | \- aopalliance:aopalliance:jar:1.0:compile 
[INFO] \- org.aspectj:aspectjweaver:jar:1.8.8:compile 
+0

カタリナで瓶を追加しましたか? –

+0

'aspectjrt-1.7.3.jar'? – user3529850

答えて

2

私は自分の質問「それは今働いているように見える原因にお答えします。必要なすべての依存関係:

<dependency> 
    <groupId>org.springframework.retry</groupId> 
    <artifactId>spring-retry</artifactId> 
    <version>1.2.1.RELEASE</version> 
</dependency> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aop</artifactId> 
    <version>4.3.11.RELEASE</version> 
</dependency> 
<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjweaver</artifactId> 
    <version>1.8.10</version> 
</dependency> 

チェック重複の依存関係(必要な場合<exclusions>を使用し、mvn dependency:treeによりf.e.)がない場合。設定クラスを@EnableRetryで飾ってください。何らかの理由で、呼び出し側をメソッド自体から分離する必要があります。 F.e.this:

@Retryable(maxAttempts = 4, value = {ResourceAccessException.class}, backoff = @Backoff(delay = 5000)) 
public ResponseEntity<String> tryToSendAndReturnResponseByRestTemplate(final RestTemplate restTemplate, 
                     final HttpEntity<MyObjDTO> 
                       request) { 

    return restTemplate.exchange(resolveUrl(ENDPOINT_ADDRESS), HttpMethod.POST, request, String.class); 
} 

SenderManager f.e. @Serviceおよび異なるクラスf.e. PhoneDirectorクラスは、あなたが呼び出す:

senderManager.tryToSendAndReturnResponseByRestTemplate(restTemplate, request); 

それが動作するはずです。 (あなたは(ここでしか4後場合に返されることになって何を指定する必要がある場合)あなたはまだ例外を取得しているしようと、あなたは)SenderManagerクラスに(別のメソッドを作成することができ、このように、@Recoverが付い:

@Recover 
public ResponseEntity<String> recoverWhenSendingMessageFailed(final ResourceAccessException e) { 
    return new ResponseEntity<>(e.getMessage(), HttpStatus.REQUEST_TIMEOUT); 
} 

しかし、あなたはそれは以下のように春ブート・スターター・AOP依存を追加した後に私のために働いたことarguments are populated from the argument list of the failed method in the same order as the failed method, and with the same return type

0

覚え(@Recover方法で)@Retryableから引数を必要に応じて:

compile ("org.springframework.boot:spring-boot-starter-aop:1.5.10.RELEASE") 
関連する問題