2016-05-25 32 views
1

In Camel (JBoss Fuse, Spring DSL speziell) Ich versuche, einen booleschen Wert mit Camel Simple Ausdruck zu lesen.Camel einfachen Ausdruck wirft 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> 

$ {body} ist ein gültiger Nicht-Null-POJO, 'FieldA' ist eine weitere verschachtelte POJO und Feldbus ist ein boolescher Wert. Fielda kann null sein, Körper aber nicht.

Wenn fielda nicht null ist, kann ich den Wert ohne Fehler lesen.

Aus verschiedenen Dokumentationsquellen (Apache Camel Einfach, JBoss Fuse) wird angegeben, dass

?.

Konstrukt kann als null-sichere Felder Lesevorgänge verwendet werden.

Beide der oben genannten wirft NPE, wenn fielda null ist und praktisch bin ich nicht in der Lage, einen Nullsafe hier zu lesen. Danke für die Hilfe.

Stack ist wie folgt:

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

Verwenden Sie die Red Hat Kundenportal, um Hilfe mit dem JBoss Fuse-Produkt zu bekommen –

Antwort

-1

Haben Sie versucht, die Aussagen zu wechseln? Zum Beispiel:

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

Nette Idee, aber es scheint, als ob Camel Simple dieses Konstrukt nicht unterstützt: org.apache.camel.language.simple.types.SimpleParserException: Unexpected token null – gyorgyabraham

+1

Warum werden Sie downvoting? dieser Vorschlag? Dir ist klar, dass ich die Antwort und den Vorschlag besser bearbeiten kann. Vergiss es. –

+0

Weil es das Problem nicht löst, sondern noch mehr, löst eine Ausnahme aus, weil es in Camel illegal ist. Edit: Okay, ich werde es noch einmal überprüfen, aber ich kann den Downvote nicht entfernen. – gyorgyabraham

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

Dies funktioniert absolut zuverlässig und in einem Null-sicher. Ich bin mehr als enttäuscht, Camel.

+0

Funktioniert das, wenn der Körper POJO ist? Ich dachte, dass dies nur für xml/xslt –

+0

Ja, es funktioniert. Ich habe dies in einen Kontext gestellt, in dem mein Körper noch ein String ist (vor POJO-Konvertierung). – gyorgyabraham

0

Die?. Die Syntax, die Sie verwenden möchten, funktioniert nur mit Spring Expression Language (SPEL). Bitte lesen Sie die Kamel-docs hier: http://camel.apache.org/spel.html

Hier ist ein Beispiel von dieser Seite:

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

Ich kann nichts finden über?. auf der verknüpften SPEL-Seite, aber ich kann sie auf http://camel.apache.org/simple.html finden. Bist du sicher? – gyorgyabraham

+0

Ziemlich sicher, ja ... Diese Syntax ist SPEL, nicht Camel's Simple Sprache. Nicht sicher, warum es auf der Simple-Seite ist ... –

0

Sie die Getter-Methoden für diese Felder verwenden können, wenn Sie sie zur Verfügung haben:

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