2015-09-17 1 views
0

Я пытаюсь получить доступ к данным из ведра S3 с подходом ниже. создал класс SpringInjectionВесенний загрузчик ресурсов SpEL error - EL1004E: (поз. 24)

public class SpringResourceInjection { 

    @Inject 
    public AmazonS3 s3client2; 

    @Autowired 
    public ResourceLoader resourceLoader; 

    public Resource s3Resource; 


    public Resource getS3Resource() { 
     return s3Resource; 
    } 

    public void setS3Resource(Resource s3Resource) { 
     this.s3Resource = s3Resource; 
    } 
} 

и Autowire боб в моем контексте приложения

<bean id="springResourceInjection" class="com.xx..SpringResourceInjection" scope="step"> 
    <property name="s3Resource" value="s3:// + ${awsBucketName} +/+ #{stepExecutionContext['fileResource']}"/> 
</bean> 

и вызвать метод getResource через SPEL переменного ресурса

<bean id="itemreader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> 
<property name="resource" value="#{springResourceInjection.getS3Resource()}"/> 

и я получаю сообщение об ошибке заявив, что метод не найден из типа com.sun.proxy. $ Proxy18 что-то не так в моей конфигурации. Пожалуйста помоги.

Ошибка:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.itemreader' defined in class path resource [spring-config.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 24): Method call: Method getS3Resource() cannot be found on com.sun.proxy.$Proxy18 type 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:548) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:341) 
at org.springframework.batch.core.scope.StepScope.get(StepScope.java:110) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:336) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:187) 
at com.sun.proxy.$Proxy19.open(Unknown Source) 
at org.springframework.batch.item.support.CompositeItemStream.open(CompositeItemStream.java:96) 
at org.springframework.batch.core.step.item.ChunkMonitor.open(ChunkMonitor.java:114) 
at org.springframework.batch.item.support.CompositeItemStream.open(CompositeItemStream.java:96) 
at org.springframework.batch.core.step.tasklet.TaskletStep.open(TaskletStep.java:310) 
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195) 
at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:139) 
at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:136) 
at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 

Вызванный: org.springframework.beans.factory.BeanExpressionException: разбор выражений не удалось; Вложенное исключение - org.springframework.expression.spel.SpelEvaluationException: EL1004E: (позиция 24): вызов метода: метод getS3Resource() не найден на com.sun.proxy. $ Proxy18 type at org.springframework.context.expression. StandardBeanExpressionResolver.evaluate (StandardBeanExpressionResolver.java:146)

ответ

0

Попытка быстрой и грязной попытки: #{springResourceInjection.S3Resource}.

Облачные бобы, проксированные стандартным прокси-сервером Java, не предоставляют конкретные методы класса.
У вас есть 2 выбора:

  1. Сделать SpringResourceInjection интерфейс и с S3Resource методы доступа
  2. Используйте CGLIB для создания проксирования без проксирования

Первое решение довольно просто, второй один требует больше работы (вы может найти много информации о SO).

Как последнее слово: почему вы смешиваете xml и java config? Обычно это плохая идея; сделать выбор и идти вперед.

+0

Оцените шаг быстрого ответа, который работает для меня. Причина, по которой я конвертирую конфигурацию Java в XML, объясняется тем, что все мое приложение основано на XML. – sve

Смежные вопросы