2010-05-04 4 views
8

Tôi có một file ApplicationContext.xml với các nút sau:Làm cách nào để tạo các thuộc tính trong các tệp thuộc tính trong Mùa xuân?

<context:property-placeholder 
location="classpath:hibernate.properties, classpath:pathConfiguration.properties" /> 

Nó chỉ ra rằng cả hai properties file này sẽ được sử dụng bởi ứng dụng của tôi.

Bên pathConfiguration.properties, một số đường dẫn được định nghĩa, chẳng hạn như:

PATH_ERROR=/xxx/yyy/error 
PATH_SUCCESS=/xxx/yyy/success 

Một bean PathConfiguration có setters cho mỗi con đường.

Vấn đề là: khi một số đường dẫn bắt buộc không được xác định, không có lỗi nào được ném. Tôi nên xử lý vấn đề này ở đâu và ở đâu?

+0

Bạn sử dụng phiên bản Spring nào trong dự án của mình? Bạn đã tham chiếu một phiên bản cũ trong một bình luận bên dưới. – stefanglase

+0

Vâng, tôi quên đề cập đến. Mùa xuân 2.5 –

Trả lời

6

Hành vi chuẩn của PropertyPlaceholder được định cấu hình thông qua <context:property-placeholder ... /> ném ngoại lệ khi thuộc tính không thể được giải quyết khi được yêu cầu ở một số nơi miễn là bạn không định cấu hình khác.

Đối với trường hợp của bạn nếu bạn có một Bean yêu cầu một số thuộc tính như thế này, nó sẽ thất bại khi giá trị không thể được giải quyết. Ví dụ như thế này:

public class PropertiesAwareBean { 

    @Value("${PATH_ERROR}") 
    private String errorPath; 

    String getErrorPath() { 
    return errorPath; 
    } 

} 

Nếu bạn muốn thư giãn PropertyPlaceholder và không làm cho nó ném một ngoại lệ khi một tài sản không thể được giải quyết, bạn có thể cấu hình các PropertyPlaceholder bỏ qua thuộc tính không thể giải quyết như <context:property-placeholder ignore-unresolvable="true" ... /> này.

0

Tôi không chắc liệu tôi có hiểu rõ vấn đề của bạn hay không, nhưng có thể có nhiều cách để tiếp cận vấn đề này. Người ta sẽ làm cho các đường dẫn bắt buộc bằng cách sử dụng tiêm constructor. Trong hàm tạo, bạn có thể xác nhận hợp lệ các giá trị đến và nếu null, ví dụ, ném các cá thể BeanInitializationException.

+0

Tôi nghĩ rằng bạn hiểu vấn đề :-) Trong thực tế, tôi hoàn toàn mới đến mùa xuân và không thể tìm ra cách để thực hiện tiêm constructor. Tôi sẽ đọc một số về nó và nếu đây là giải pháp tôi sẽ trở lại đây để cung cấp cho bạn +1. (Nếu bạn có thể cập nhật câu trả lời của bạn với một ví dụ, nó sẽ là tuyệt vời) –

+0

... nghĩ rằng tôi tìm thấy giải pháp ở đây: http://static.springsource.org/spring/docs/2.0.3/reference/beans.html # beans-factory-properties-detail (mục 3.5.1.2.1). Đó có phải ý của bạn? –

+0

Vâng, đó là những gì tôi đã nghĩ đến. Tôi không có một ví dụ về tôi. Nhưng điều cần lưu ý là lợi ích của việc xây dựng tiêm là bạn có thể đảm bảo rằng các thông số cần thiết được truyền vào. Nhưng hãy nhớ rằng không đảm bảo chúng là chính xác. Bạn vẫn có thể muốn xác thực các giá trị thuộc tính bên trong hàm tạo và ném một BeanInitializationException nếu chúng không đúng. – drekka

1

Một cách để củng cố việc xác minh thông số là chuyển sang một bean cổ điển PropertyPlaceholderConfigurer trong tệp bean của bạn.

Các PropertyPlaceholderConfigurer có các thuộc tính mà bạn có thể sử dụng để tinh chỉnh hành vi của nó và chỉ định ngoại lệ được ném hay không nếu thiếu một số khóa (xem setIgnoreUnresolvablePlaceholders hoặc setIgnoreResourceNotFound).

Nếu tôi nhớ chính xác, trong mùa xuân 2.5, chỉ thuộc tính vị trí được hỗ trợ cho <context:property-placeholder> (mọi thứ có thể đã thay đổi).

+0

Bạn đúng cho Spring 2.5 chỉ có thuộc tính 'location' và' properties-ref'. Mùa xuân 3.0 cung cấp nhiều khả năng cấu hình hơn trên '' -Tag như đã đề cập trong câu trả lời của tôi. – stefanglase