java - Spring 应用程序错误: EL1008E

标签 java spring spring-integration spring-el spring-dsl

我一直在开发一个 Spring Integration 项目,使用企业集成模式来使用 MQ 消息,进行一些处理,然后将它们写入另一个队列。

我的问题与 this one 非常相似然而,接受的答案并没有为我解决这个问题。

收到来自外部 Web 服务的响应后,我的 @Cacheable @Component 类将主体作为 ArrayList 返回。我收到以下错误:

org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 1): Property or field 'valid' cannot be found on object of type 'java.util.ArrayList' - maybe not public?

这是我认为有问题的类:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.curator.x.discovery.ServiceCache;
import org.apache.curator.x.discovery.ServiceInstance;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

@Component
public class DirectoryRepo {

    @Autowired
    private CacheManager cacheManager;

    @Autowired
    private ServiceCache<ServiceDetail> directoryServiceCache;

    @Autowired
    private RestTemplate restTemplate;

    private ArrayList<X> response;

    private static final Logger logger = LogManager.getLogger();

    @Cacheable(value = "X", unless = "!#result.valid")
    public ArrayList<X> checkForX(String a,
            String b, String c, String d) {

            try {

                //code omitted

                HttpHeaders headers = new HttpHeaders();
                headers.add("token", service.getPayload().getToken());

                ResponseEntity<X[]> responseEntity = restTemplate
                        .exchange(request, HttpMethod.GET, new HttpEntity<>(
                                headers), X[].class);


                if (responseEntity != null && responseEntity.hasBody()) {

                    response = new ArrayList<X>(Arrays.asList(responseEntity.getBody()));
                    return response;
                } else {
                    logger.debug("received unexpected responseEntity: {}",
                            responseEntity);
                }
            } catch (RestClientException e) {
                logger.error("failed to get X - {}",
                        e.getMessage(), e);
            }

        throw new ServiceException(
                "failed to get X - Directory service unavailable");
    }

    public ArrayList<X> getResponse() {
        return this.response;
    }

    /**
     * Clears out all entries from the X cache.
     */
    @CacheEvict(value = "X", allEntries = true)
    public void clearXCache() {
        logger.trace("cacheManager:{}", cacheManager);
    }

}

如你所见,我尝试设置公共(public)getter方法,但仍然出现异常:

org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 1): Property or field 'valid' cannot be found on object of type 'java.util.ArrayList' - maybe not public
?
        at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:224) ~[spring-expression-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:94) ~[spring-expression-4.2.4.RELEASE.jar:4.2.4.RELEASE
]
        at org.springframework.expression.spel.ast.PropertyOrFieldReference.access$000(PropertyOrFieldReference.java:46) ~[spring-expression-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.expression.spel.ast.PropertyOrFieldReference$AccessorLValue.getValue(PropertyOrFieldReference.java:374) ~[spring-expression-4.2.4.RELEASE.jar:4.2.4
.RELEASE]
        at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:88) ~[spring-expression-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:170) ~[spring-expression-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.expression.spel.ast.OperatorNot.getValueInternal(OperatorNot.java:47) ~[spring-expression-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.expression.spel.ast.OperatorNot.getValueInternal(OperatorNot.java:36) ~[spring-expression-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:131) ~[spring-expression-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:299) ~[spring-expression-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.cache.interceptor.ExpressionEvaluator.unless(ExpressionEvaluator.java:123) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.cache.interceptor.CacheAspectSupport$CacheOperationContext.canPutToCache(CacheAspectSupport.java:623) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELE
ASE]
        at org.springframework.cache.interceptor.CacheAspectSupport$CachePutRequest.apply(CacheAspectSupport.java:675) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:361) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:302) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61) ~[spring-context-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) ~[spring-aop-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at somepackage.DirectoryRepo$$EnhancerBySpringCGLIB$$f7709589.checkForX(<generated>) ~[DirectoryRepo.class:?]
        at somepackage.DirectoryService.getX(DirectoryService.java:66) ~[DirectoryService.class:?]

上下文.xml:

<?xml version='1.0' encoding='utf-8'?>
<Context displayName="appName" path="/appName" copyXML="true">

</Context>

最佳答案

这个错误对我来说似乎很清楚。

目前尚不清楚您要做什么。 #result 变量是对...呃...调用方法的结果的引用 - 即ArrayList

ArrayList 没有 isValid()getValid() 方法。

The documentation about Conditional Caching描述了您可以使用哪些变量。

As you can see I have tried setting a public getter method

我没有看到任何这样的事情。

您可以执行诸如 result.size() > 0a != 'foo' 之类的操作。

关于java - Spring 应用程序错误: EL1008E,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35892856/

相关文章:

Java 整数在比较两个整数时返回奇怪的结果?

java - iPad/iPhone 上的 HTTP 字节范围协议(protocol)客户端行为

java - Spring JavaConfig-NoSuchBeanDefinitionException : No unique bean of type

spring - 将轮询器添加到 SFTP 出站网关

transactions - 为什么 Spring 集成和批处理事务的每个方法( Spring 批处理作业)的默认隔离级别设置为 SERIALIZABLE?

java - 使用 parseInt 更改整数值

java - SonarQube 4.5.1 初始安装与oracle数据库

java - 设置基于 Spring security 的 OAuth2 服务器

java - XML 中的 spring 配置文件错误

java - Spring Integration Zookeeper - 我目前是领导者吗