51

I have a groovy class where I wan to autowire a property value.

Eg:

public @Value("${valueA}" ) String valueA;

With the addition of the the property-placeholder in my appliction context

<context:property-placeholder location="classpath:spring/app.properties" />

The app.properties has a value set for "valueA" so in theory this should populate the String valueA in my class at runtime.

This setup works perfectly if I use a java class but not if I use a groovy class.

I get a compile error:

Error: expected '$valueA' to be an inline constant of type java.lang.String in @org.springframework.beans.factory.annotation.Value
Error: Attribute 'value' should have type 'java.lang.String'; but found type 'java.lang.Object' in @org.springframework.beans.factory.annotation.Value

I just want to know if the above syntax is correct when using a groovy class and if not what is the correct syntax for autowiring the @Value parameter at runtime.

1
  • Thanks for asking this. It was driving me sort of crazy but the answers below do the trick. Commented Jun 8, 2014 at 18:08

2 Answers 2

87

Use single quotes, ie.

public @Value('${valueA}') String valueA
Sign up to request clarification or add additional context in comments.

3 Comments

Is this because with double quotes you get a GString instead of a String and the substitution is done at the wrong time?
Thanks, this affected me in my Groovy project. I suspect this doesn't happen in Java as there is no GString type.
This seems to work, but not when attempting to use a default value. public @Value('${propertyName:defaultValue}') String valueA In this scenario, 'defaultValue' is always used as the value for propertyName, even when overridden in a property file. The value in the property file is not used.
33

since using a $ causes Groovy to interpret the annotation argument as a GString, you get a compile error. you can either escape \$ or use single quotes.

Comments

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.