小编典典

Spring Boot外部化Java注释上的配置属性/消息

spring-boot

有没有一种方法可以在Spring从外部属性文件中读取文本而无需使用@Value注释。例如:application.properties

var.foo="hello"

我可以用

@Value("${var.foo}") String value;

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

@NotNull(message={custom.notnull})

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

例如,如果我有一个resource(web component)类,并且必须使用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是否提供这种选择?如果没有,如何设置一个?

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


阅读 262

收藏
2020-05-30

共1个答案

小编典典

我认为除非您使用的批注的基础实现或者具有其自己的i18n标准(如ValidationMessages.properties)或支持Spring的标准,否则您无法实现这一目标MessageSource

在后一种选择的情况下,您所需要做的就是将键/值对添加到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。

2020-05-30