org.springframework.expression.spel.SpelParseException: The value cannot be parsed as an int

I was trying to format timestamp inside int:header and encountered a strange behavior related to SpEL(as a matter of fact I've already found out that header-enricher should only be used for static values, so my approach is wrong in the first place, but I'm still curious about the exception I've got).

 <int:header-enricher> <int:header name="originalFilename" expression="#{T(org.apache.commons.lang3.time.DateFormatUtils).format(new java.util.Date(), 'yyyyMMddhhmm')}"/> </int:header-enricher>

Stack trace:

Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.integration.transformer.support.ExpressionEvaluatingHeaderValueMessageProcessor]: Constructor threw exception; nested exception is org.springframework.expression.spel.SpelParseException: EL1035E:(pos 26): The value '201504101118' cannot be parsed as an int at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164) ~[spring-beans-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:125) ~[spring-beans-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:270) ~[spring-beans-4.0.7.RELEASE.jar:4.0.7.RELEASE] ... 71 common frames omitted
Caused by: org.springframework.expression.spel.SpelParseException: EL1035E:(pos 26): The value '201504101118' cannot be parsed as an int at org.springframework.expression.spel.ast.Literal.getIntLiteral(Literal.java:79) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.maybeEatLiteral(InternalSpelExpressionParser.java:736) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatStartNode(InternalSpelExpressionParser.java:459) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatPrimaryExpression(InternalSpelExpressionParser.java:301) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatUnaryExpression(InternalSpelExpressionParser.java:295) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatPowerIncDecExpression(InternalSpelExpressionParser.java:251) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatProductExpression(InternalSpelExpressionParser.java:230) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatSumExpression(InternalSpelExpressionParser.java:216) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatRelationalExpression(InternalSpelExpressionParser.java:168) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatLogicalAndExpression(InternalSpelExpressionParser.java:156) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatLogicalOrExpression(InternalSpelExpressionParser.java:144) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatExpression(InternalSpelExpressionParser.java:104) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.InternalSpelExpressionParser.doParseExpression(InternalSpelExpressionParser.java:85) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:56) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:32) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression(TemplateAwareExpressionParser.java:76) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression(TemplateAwareExpressionParser.java:62) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE] at org.springframework.integration.transformer.support.ExpressionEvaluatingHeaderValueMessageProcessor.<init>(ExpressionEvaluatingHeaderValueMessageProcessor.java:62) ~[spring-integration-core-4.0.4.RELEASE.jar:na] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.7.0_75] at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.7.0_75] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.7.0_75] at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:1.7.0_75] at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148) ~[spring-beans-4.0.7.RELEASE.jar:4.0.7.RELEASE] ... 73 common frames omitted
Caused by: java.lang.NumberFormatException: For input string: "201504101118" at java.lang.NumberFormatException.forInputString(Unknown Source) ~[na:1.7.0_75] at java.lang.Integer.parseInt(Unknown Source) ~[na:1.7.0_75] at org.springframework.expression.spel.ast.Literal.getIntLiteral(Literal.java:75) ~[spring-expression-4.0.7.RELEASE.jar:4.0.7.RELEASE]

Seriously, why java.lang.Integer.parseInt?

Same thing happens when I try:

#{T(org.apache.commons.lang3.time.DateFormatUtils).format(1428647461944L, 'yyyyMMddhhmm')}"/>

I also found this open jira issue:

Is it the cause of the exception?

1

1 Answer

@rompetroll 's comment is correct; the "#{...}" syntax is for static values evaluated once, when the context initializes.

Spring integration uses runtime expressions, evaluated each time a message arrives at the component. Simply remove the #{ and }.

You are trying to inject a static value into a property that expects an expression.

0

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like