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。
你只需要做两个小调整就能解决问题:
- 给
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; } }
- 优化Camel Simple表达式的写法:不用直接调用getter方法名,改用属性访问语法,更简洁也更符合Camel的规范:
.when().simple("${body.fName} == 'f1'")
这样调整后,Camel就能正常反射调用TestPOJO的getter方法,Choice组件也能正确根据属性过滤消息了。
内容的提问来源于stack exchange,提问作者Jericho
相关产品推荐
相关产品推荐

