6

我有以下 spring 伪代码有线 scala 类。

@Service
class Something {

@Value("${some.property}")
val someString : String

// do something with someString in the body
}

但是,这不起作用,因为 someString 是构造函数主体的一部分,并且在构造函数执行之前,spring 无法连接值。

我如何连接@Value 以便它工作,并且不可怕(我当前的解决方案使用包含我需要的所有值的自定义构造函数只是感觉不到“scala”并且看起来很糟糕。

编辑:澄清一下,我目前的解决方案是这样的:

@Service
class Something { 
  @Autowired 
  def this(@Value("${some.prop}") prop : String) { 
    this() 
    // do other construction stuff here
  }
}

我只是觉得它看起来很丑,觉得有更好的方法。当我宁愿在主构造函数上强制执行时,我也不喜欢创建这些辅助构造函数。

编辑2:为了进一步澄清,我希望有一种方法可以做这样的事情:

@Service
class Something(@Value("${some.property}") string : String) {
// use the value in your constructor here
}

因为这看起来要优雅得多。我只是无法让它工作:)

4

2 回答 2

6

好的,经过所有的来回,我我更了解你想要什么,所以这是我的看法:

import scala.annotation.BeanProperty
import scala.annotation.target.beanSetter
class Something @Autowired() (@(Value @beanSetter)("{some.property}") @BeanProperty var prop: String)

这本质上是 Paolo Falabella 的解决方案,只是我尽量避免让 Spring 访问私有字段。为此,我让 scala 使用@BeanProperty 应用@Value它自动生成一个类似 java 的公共 setter。您还可以通过使用类型别名来稍微改进语法:

type Value = org.springframework.beans.factory.annotation.Value @beanSetter @beanGetter
class Something @Autowired() ( @BeanProperty@Value("{some.property}") var prop: String)
于 2012-10-30T13:18:57.263 回答
3

您需要初始化someString一个值,以便在类中生成一个真实的字段。或者,您可以使用 avar而不是 a val,但无论哪种方式,您都必须对其进行初始化。

例如:

@Service
class TestService {
  @Value("${testService.foo:bar}")
  val foo: String = null
  //var foo: String = _
}

反编译TestService.class 文件你会看到它把注解放在一个private final String字段上(你也可以使用jclasslib 字节码查看器):

@Service
@ScalaSignature(bytes="\006\001!3A!\001\002\001\023\tYA+Z:u'\026\024h/[2f\025\t\031A!\001\005tKJ4\030nY3t\025\t)a!A\002osbT\021aB\001\004G>l7\001A\n\004\001)\021\002CA\006\021\033\005a!BA\007\017\003\021a\027M\\4\013\003=\tAA[1wC&\021\021\003\004\002\007\037\nTWm\031;\021\005M1R\"\001\013\013\003U\tQa]2bY\006L!a\006\013\003\027M\033\027\r\\1PE*,7\r\036\005\0063\001!\tAG\001\007y%t\027\016\036 \025\003m\001\"\001\b\001\016\003\tAqA\b\001C\002\023\005q$A\002g_>,\022\001\t\t\003C\021r!a\005\022\n\005\r\"\022A\002)sK\022,g-\003\002&M\t11\013\036:j]\036T!a\t\013\t\r!\002\001\025!\003!\003\0211wn\034\021)\t\035R\003(\017\t\003WYj\021\001\f\006\003[9\n!\"\0318o_R\fG/[8o\025\ty\003'A\004gC\016$xN]=\013\005E\022\024!\0022fC:\034(BA\0325\003=\031\bO]5oO\032\024\030-\\3x_J\\'\"A\033\002\007=\024x-\003\0028Y\t)a+\0317vK\006)a/\0317vK\006\n!(\001\f%wR,7\017^*feZL7-\032\030g_>T$-\031:~\021\025a\004\001\"\001>\003)Ig.\033;jC2L'0\032\013\002}A\0211cP\005\003\001R\021A!\0268ji\"\022\001A\021\t\003\007\032k\021\001\022\006\003\013J\n!b\035;fe\026|G/\0379f\023\t9EIA\004TKJ4\030nY3")
public class TestService
  implements ScalaObject
{

  @Value("${testService.foo:bar}")
  private final String foo;

  public String foo()
  {
    return this.foo;
  }

  public TestService()
  {
    null; this.foo = null;
  }
}

我一直用@Value在班上,很方便。

于 2012-10-29T19:17:33.547 回答