2016-05-25 39 views
1

在駱駝(JBoss熔絲,特別是Spring DSL)我想用駱駝簡單表達式讀取一個布爾值。駱駝簡單表達式拋出NPE

<simple resultType="java.lang.Boolean">${body} != null and ${body.fielda} != null and ${body.fielda.fieldb} != null and ${body.fielda.fieldb}</simple> 

<simple resultType="java.lang.Boolean">${body?.fielda?.fieldb}</simple> 

$ {體}是一個有效的非空POJO, 'FIELDA' 是另一個嵌套POJO和fieldb是一個布爾值。 Field可以爲null,但body不是。

當fielda非空時,我可以讀取值而不會出錯。

從各種文件源(Apache的駱駝簡單,JBoss的保險絲)中指出,

構造可以用作空安全字段讀取。

當fielda爲空並且實際上我無法提供null安全讀取時,上面的兩個都會引發NPE。 感謝您的幫助。

棧如下:

java.lang.NullPointerException 
at org.apache.camel.component.bean.ConstantBeanHolder.<init>(ConstantBeanHolder.java:43)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.language.bean.BeanExpression$OgnlInvokeProcessor.process(BeanExpression.java:264)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:114)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:132)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.model.language.ExpressionDefinition.evaluate(ExpressionDefinition.java:120)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.model.language.ExpressionDefinition.evaluate(ExpressionDefinition.java:112)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.builder.ExpressionBuilder$34.evaluate(ExpressionBuilder.java:843)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.builder.BinaryPredicateSupport.matchesReturningFailureMessage(BinaryPredicateSupport.java:60)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.builder.BinaryPredicateSupport.matches(BinaryPredicateSupport.java:50)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.language.simple.ast.BinaryExpression$5.evaluate(BinaryExpression.java:227)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.util.ExpressionToPredicateAdapter.matches(ExpressionToPredicateAdapter.java:37)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.builder.SimpleBuilder.matches(SimpleBuilder.java:76)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.ChoiceProcessor.process(ChoiceProcessor.java:90)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:163)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:51)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.RoutingSlip$2.doInAsyncProducer(RoutingSlip.java:301)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:304)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.RoutingSlip.processExchange(RoutingSlip.java:294)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.RoutingSlip.doRoutingSlip(RoutingSlip.java:215)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.RoutingSlip.process(RoutingSlip.java:146)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:163)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.TryProcessor.process(TryProcessor.java:113)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.TryProcessor.process(TryProcessor.java:84)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:163)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)[111:org.apache.camel.camel-core:2.15.1.redhat-620133] 
at org.apache.camel.component.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:162)[133:org.apache.camel.camel-jetty-common:2.15.1.redhat-620133] 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)[66:org.apache.geronimo.specs.geronimo-servlet_3.0_spec:1.0.0] 
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.servlets.MultiPartFilter.doFilter(MultiPartFilter.java:136)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.apache.camel.component.jetty.CamelFilterWrapper.doFilter(CamelFilterWrapper.java:43)[133:org.apache.camel.camel-jetty-common:2.15.1.redhat-620133] 
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1467)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.server.Server.handle(Server.java:370)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)[70:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415] 
at java.lang.Thread.run(Thread.java:745)[:1.8.0_66] 
+0

使用紅色帽子客戶門戶獲得JBoss Fuse產品幫助 –

回答

-1

你試過切換報表?例如:

<simple>null != {${body}</simple> 
+0

不錯的想法,但它似乎像駱駝簡單不支持這種構造:org.apache.camel.language.simple.types.SimpleParserException:意外的標記null – gyorgyabraham

+1

爲什麼你downvoting那個建議?你意識到我可以編輯答案和建議一個更好的。沒關係。 –

+0

因爲它不能解決問題,但更多的是拋出異常,因爲它在駱駝中非法。編輯:好吧,我會重新檢查,但我不能刪除downvote。 – gyorgyabraham

0
 <setProperty propertyName="propName"> 
      <xpath resultType="java.lang.Boolean">//*[local-name()='NodeName'][text() = 'true']</xpath> 
     </setProperty> 

這工作絕對可靠,並在空安全的方式。我非常失望,駱駝。

+0

身體是POJO時,這是否正常工作?我認爲這隻適用於xml/xslt –

+0

是的,它的工作原理。我把它放在一個上下文中,我的body仍然是一個String(在POJO轉換之前)。 – gyorgyabraham

0

The?。您嘗試使用的語法僅適用於Spring Expression Language(SPEL)。請到這裏查看駱駝文檔:http://camel.apache.org/spel.html

下面是該頁面的例子:

<route> 
    <from uri="direct:foo"/> 
    <filter> 
    <spel>#{request.headers['foo'] == 'bar'}</spel> 
    <to uri="direct:bar"/> 
    </filter> 
</route> 
+0

我找不到任何關於?的信息。在鏈接的SPEL頁面上,但我可以在http://camel.apache.org/simple.html上找到它。你確定? – gyorgyabraham

+0

相當肯定,是的......該語法是SPEL,而不是駱駝的簡單語言。不知道爲什麼它在簡單頁面上... –

0

,如果你讓他們提供可以使用getter方法這些字段:

${body.getFielda} != null and ${body.fetFielda.getFieldb} != null