Spring引导在Java注释

时间:2016-08-23 17:29:52

标签: java spring properties spring-boot annotations

有没有办法在不使用@Value注释的情况下在spring中从外部属性文件中读取文本。例如:application.properties

var.foo="hello"

我可以使用

将它注入一个spring bean中
@Value("${var.foo}") String value;

作为类变量。有没有办法在不使用@Value注释的情况下包含此属性。类似于JSR bean验证的方式。

@NotNull(message={custom.notnull})

并在 ValidationMessages.properties 文件中外部化此属性值。

示例,如果我有一个资源(Web组件)类,并且我必须使用Swagger注释来记录它们,

@controller
@path("/")
@Api(description = "User Resource API")
public class UserResource {

    @Path("/users")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "returns user details", notes = "some notes")
    public User getUser() {

        return new User(123, "Joe", "Montana");
    }
}

和模型,

@ApiModel("user model")
public class User {

    @ApiModelProperty(value = "This represents user id")
    private String id;
    private String firstName;
    private String lastName;
    ...
}

如何将此字符串/句子/消息外部化为外部属性文件。我认为这适用于一般的Java注释和spring,而不是Swagger特有的。我指定Swagger的原因是,如果像hibernate验证一样,Java库可以选择在外部ValidationMessages.properties文件中指定这些消息,并且spring默认知道它可以获取(或者可以配置)。

Swagger是否提供这样的选择?如果没有,我该如何设置?

潜在的问题是,我不想让我的代码/逻辑与文档相关的数据(元数据)混乱。

4 个答案:

答案 0 :(得分:6)

我认为你不能实现这个目标,除非你使用的注释的底层实现或者带有他们自己的i18n标准(比如ValidationMessages.properties),或者支持Spring的MessageSource。 / p>

对于后者的替代方案,您所要做的就是在messages.properties文件中添加键/值对,让框架完成剩下的工作:

<强> messages.properties

my.validation.error.message=Something went terribly wrong!

<强> SomeClass.java

@MySpringCompatibleValidationAnnotation("my.validation.error.message")
private String someVariable;

底线是,根据您尝试使用的框架,它可能支持也可能不支持这种开箱即用。

现在,就Swagger而言,i18n对文档的支持被​​提议作为一项新功能,但它被关闭或暂停,同时他们更多地考虑应该如何实现它。有关详细信息,请参阅https://github.com/OAI/OpenAPI-Specification/issues/274

答案 1 :(得分:2)

使用@Value("${property}")注释来注入配置属性有时会很麻烦,所以spring boot引入了@ConfigurationProperties,这应该是你想要的解决方案。

Here是参考文档。

答案 2 :(得分:2)

You can use a placeholder when you declare a bean in your configuration file.Here you can try an example : https://www.mkyong.com/spring/spring-propertyplaceholderconfigurer-example/

答案 3 :(得分:-2)

如果您使用的是Spring Boot,那么您可以尝试此方法,而无需进行任何特殊配置

@environment.getProperty('property')