You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Camel使用Choice过滤对象时出现IllegalAccessException求助

Apache Camel Choice组件无法访问POJO getter方法抛出IllegalAccessException

我在尝试用Apache Camel的Choice组件根据POJO的属性过滤消息时,遇到了IllegalAccessException,没法正常调用对象的getter方法,麻烦帮忙排查下问题。

我的代码

public class SampleTimerRouter extends RouteBuilder {
 @Override
 public void configure() throws Exception {
 from("timer:simpleTimer1?period=2000").process((exchange) -> {
 List<TestPOJO> names = new ArrayList<>();
 names.add(new TestPOJO("f1"));
 names.add(new TestPOJO("f2"));
 exchange.getOut().setBody(names);
 }).split(body(TestPOJO.class)).choice().when().simple("${body.getfName} == 'f1'")
.process((exchange) -> {
 exchange.getOut().setBody(exchange.getIn().getBody(TestPOJO.class).getfName());
 }).to("file:output.txt?fileExist=Append").otherwise().to("stream:out");
 }
}
class TestPOJO {
 private String fName;
 public TestPOJO(String f) {
 fName = f;
 }
 public String getfName() {
 return fName;
 }
 public void setfName(String fName) {
 this.fName = fName;
 }
}

错误日志

Caused by: org.apache.camel.RuntimeExchangeException: IllegalAccessException occurred invoking method: public java.lang.String com.TestPOJO.getfName() using arguments: [] on the exchange: Exchange[]
 at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:474) ~[camel-core-2.19.1.jar:2.19.1]
 at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:291) ~[camel-core-2.19.1.jar:2.19.1]
 at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:264) ~[camel-core-2.19.1.jar:2.19.1]
 at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:178) ~[camel-core-2.19.1.jar:2.19.1]
 at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109) ~[camel-core-2.19.1.jar:2.19.1]
 at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:69) ~[camel-core-2.19.1.jar:2.19.1]
 at org.apache.camel.language.bean.BeanExpression$InvokeProcessor.process(BeanExpression.java:212) ~[camel-core-2.19.1.jar:2.19.1]
 at org.apache.camel.language.bean.BeanExpression$OgnlInvokeProcessor.process(BeanExpression.java:323) ~[camel-core-2.19.1.jar:2.19.1]
 ... 32 common frames omitted
Caused by: java.lang.IllegalAccessException: Class org.apache.camel.component.bean.MethodInfo can not access a member of class com.TestPOJO with modifiers "public"
 at sun.reflect.Reflection.ensureMemberAccess(Unknown Source) ~[na:1.8.0_151]
 at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(Unknown Source) ~[na:1.8.0_151]
 at java.lang.reflect.AccessibleObject.checkAccess(Unknown Source) ~[na:1.8.0_151]
 at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_151]
 at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:472) ~[camel-core-2.19.1.jar:2.19.1]
 ... 39 common frames omitted

问题排查与解决方案

这个问题的核心原因很明确:你的TestPOJO类没有加public修饰符,属于默认包访问权限。JVM的访问控制规则里,默认包下的类,其他包(比如Camel的org.apache.camel包)的代码哪怕通过反射也无法访问它的成员——哪怕你的getter方法是public的也不行,这就是为什么会抛出IllegalAccessException。

你只需要做两个小调整就能解决问题:

  1. 给TestPOJO类添加public修饰符:
public class TestPOJO {
    private String fName;
    public TestPOJO(String f) {
        fName = f;
    }
    public String getfName() {
        return fName;
    }
    public void setfName(String fName) {
        this.fName = fName;
    }
}
  1. 优化Camel Simple表达式的写法:不用直接调用getter方法名,改用属性访问语法,更简洁也更符合Camel的规范:
.when().simple("${body.fName} == 'f1'")

这样调整后,Camel就能正常反射调用TestPOJO的getter方法,Choice组件也能正确根据属性过滤消息了。

内容的提问来源于stack exchange,提问作者Jericho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:27:33