2016-08-23 39 views
11

Có cách nào để đọc văn bản từ tập tin thuộc tính bên ngoài vào mùa xuân mà không sử dụng chú thích @Value. Ex: application.propertiesSpring boot externalize cấu hình thuộc tính/tin nhắn trên chú thích Java

var.foo="hello" 

tôi có thể tiêm nó trong một đậu mùa xuân sử dụng

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

như là một biến lớp. Có cách nào để bao gồm thuộc tính này mà không sử dụng chú thích @Value hay không. Một cái gì đó giống như cách xác thực đậu JSR.

@NotNull(message={custom.notnull}) 

và bạn ra bên ngoài giá trị tài sản này trong ValidationMessages.properties tập tin.

Ví dụ, nếu tôi có một nguồn tài nguyên (thành phần web) lớp, và nếu tôi phải sử dụng chú thích Swagger tìm hiểu về chúng,

@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"); 
    } 
} 

và mô hình,

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

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

Làm thế nào để bạn bên ngoài chuỗi/câu/thư này thành tệp thuộc tính bên ngoài. Tôi nghĩ rằng điều này áp dụng cho chú thích Java chung và mùa xuân và không cụ thể cho Swagger. Lý do tôi chỉ định Swagger là, nếu giống như thư viện Java xác thực hibernate có tùy chọn chỉ định các thông báo này trong một tệp ValidationMessages.properties bên ngoài và mùa xuân biết theo mặc định để chọn nó lên (hoặc có thể được cấu hình).

Swagger có cung cấp tùy chọn như vậy không? Nếu không, tôi làm cách nào để thiết lập?

Vấn đề bên dưới là, tôi không muốn làm lộn xộn mã/logic của mình với dữ liệu liên quan đến tài liệu (dữ liệu meta).

+0

Bạn cần cung cấp thêm chi tiết về trường hợp sử dụng của bạn là lý do bạn không thể hoặc không muốn sử dụng chú thích '@ Value'. Có một khu vực khác của Spring xung quanh hỗ trợ i18n sử dụng messages.properties để cho phép các khu vực nhất định sử dụng thay thế mã thông báo bằng văn bản cụ thể của ngôn ngữ. –

+0

hi @shawn .. cảm ơn phản hồi của bạn. hãy để tôi chỉnh sửa câu hỏi này – Bharath

Trả lời

6

Tôi không nghĩ bạn có thể đạt được điều này trừ khi việc triển khai bên dưới các chú thích bạn đang sử dụng hoặc đi kèm với tiêu chuẩn riêng của mình cho i18n (như ValidationMessages.properties) hoặc hỗ trợ MessageSource của Spring.

Trong trường hợp của phương án thứ hai, tất cả các bạn cần phải làm là thêm cặp khóa/giá trị của mình bên trong một tập tin messages.properties và để cho khuôn khổ làm phần còn lại:

messages.properties

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

SomeClass.java

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

Bottom line là, tùy thuộc vào khuôn khổ bạn đang cố gắng sử dụng, nó có thể hoặc có thể không hỗ trợ này out-of-the-box.

Bây giờ, theo như Swagger đi, hỗ trợ i18n cho tài liệu đã được đề xuất như một tính năng mới, nhưng nó đã bị tắt hoặc tạm dừng trong khi họ suy nghĩ thêm về cách triển khai. Xem https://github.com/OAI/OpenAPI-Specification/issues/274 để biết thêm chi tiết.

+0

cảm ơn Thomas cho câu trả lời .. Tôi cảm thấy Swagger chú thích mà không cần bên ngoài các giá trị cho các thuộc tính chú thích khác nhau thêm quá nhiều lộn xộn vào mã (mô hình, tài nguyên ...). – Bharath

2

Sử dụng chú thích @Value("${property}") để chèn thuộc tính cấu hình đôi khi có thể rườm rà, do đó khởi động mùa xuân được giới thiệu @ConfigurationProperties, đây sẽ là giải pháp bạn muốn.

Here là tài liệu tham chiếu.

-2

Nếu bạn đang sử dụng Spring Boot thì bạn có thể thử phương pháp này, mà không làm bất kỳ cấu hình đặc biệt

@environment.getProperty('property') 
Các vấn đề liên quan