2014-10-09 14 views
8

Tôi đã triển khai một số ủy quyền trong dịch vụ web cần được định cấu hình.Cách chuyển bản đồ <String, String> với application.properties

Hiện tại, kết hợp người dùng/mật khẩu được mã hóa cứng vào cấu hình bean. Tôi muốn cấu hình bản đồ với người dùng và mật khẩu vào application.properties để cấu hình có thể ở bên ngoài.

Bất kỳ đầu mối nào về cách thực hiện điều này?

<bean id="BasicAuthorizationInterceptor" class="com.test.BasicAuthAuthorizationInterceptor"> 
    <property name="users"> 
     <map> 
      <entry key="test1" value="test1"/> 
      <entry key="test2" value="test2"/> 
     </map> 
    </property> 
</bean> 

Trả lời

5

Một đối tượng java.util.Properties đã là Map, thực tế là HashTable mà lần lượt thực hiện Map.

Vì vậy, khi bạn tạo tệp thuộc tính (cho phép đặt tên là users.properties), bạn có thể tải nó bằng cách sử dụng PropertiesFactoryBean hoặc <util:properties /> và đưa vào lớp học của bạn.

test1=test1 
test2=test2 

Sau đó làm một cái gì đó giống như

<util:properties location="classpath:users.properties" id="users" /> 

<bean id="BasicAuthorizationInterceptor" class="com.test.BasicAuthAuthorizationInterceptor"> 
    <property name="users" ref="users" /> 
</bean> 

Mặc dù nếu bạn có một Map<String, String> như một loại tài sản người sử dụng nó có thể thất bại ... Tôi sẽ không đặt chúng trong file application.properties. Nhưng đó có thể chỉ là tôi ..

32

Bạn có thể sử dụng @ConfigurationProperties để có giá trị từ application.properties bị ràng buộc vào một hạt. Để làm như vậy bạn chú thích phương pháp @Bean của bạn mà tạo ra đậu:

@Bean 
@ConfigurationProperties 
public BasicAuthAuthorizationInterceptor interceptor() { 
    return new BasicAuthAuthorizationInterceptor(); 
} 

Là một phần của khởi động của đậu, bất kỳ tài sản trên BasicAuthAuthorizationInterceptor sẽ được thiết lập dựa trên môi trường của ứng dụng. Ví dụ, nếu đây là lớp học của đậu của bạn:

public class BasicAuthAuthorizationInterceptor { 

    private Map<String, String> users = new HashMap<String, String>(); 

    public Map<String, String> getUsers() { 
     return this.users; 
    } 
} 

Và đây là application.properties của bạn:

users.alice=alpha 
users.bob=bravo 

Sau đó, bản đồ users sẽ được áp dụng với hai mục: alice:alphabob:bravo.

Dưới đây là một ứng dụng mẫu nhỏ mà đặt này tất cả cùng nhau:

import java.util.HashMap; 
import java.util.Map; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.boot.context.properties.EnableConfigurationProperties; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@EnableAutoConfiguration 
@EnableConfigurationProperties 
public class Application { 

    public static void main(String[] args) throws Exception { 
     System.out.println(SpringApplication.run(Application.class, args) 
       .getBean(BasicAuthAuthorizationInterceptor.class).getUsers()); 
    } 

    @Bean 
    @ConfigurationProperties 
    public BasicAuthAuthorizationInterceptor interceptor() { 
     return new BasicAuthAuthorizationInterceptor(); 
    } 

    public static class BasicAuthAuthorizationInterceptor { 

     private Map<String, String> users = new HashMap<String, String>(); 

     public Map<String, String> getUsers() { 
      return this.users; 
     } 
    } 
} 

Hãy nhìn vào các javadoc for ConfigurationProperties để biết thêm thông tin về tùy chọn cấu hình khác nhau của nó. Ví dụ, bạn có thể thiết lập một tiền tố để phân chia cấu hình của bạn thành một số không gian tên khác nhau:

@ConfigurationProperties(prefix="foo") 

Đối với các ràng buộc để làm việc, sau đó bạn sẽ phải sử dụng tiền tố giống nhau trên các thuộc tính khai báo trong ứng dụng.các thuộc tính:

foo.users.alice=alpha 
foo.users.bob=bravo 
+1

Lưu ý rằng đậu của bạn nên có một getter để mùa xuân có thể cư trú trong các bản đồ và một lĩnh vực nào là không đủ. – MeysaM

+0

@MeysaM Bạn đã đọc sai mã chưa? BasicAuthAuthorizationInterceptor đã có phương thức 'getUsers()' và trường 'users' là' private', không phải 'public'. –

+1

Không, nó chỉ là một lời nhắc nhở cho mọi người khác không lặp lại sai lầm của tôi. Mã của bạn hoạt động hoàn toàn tốt. – MeysaM

0

IMHO bạn không thể trực tiếp: tệp thuộc tính tự đọc là Map<String, String> và do đó giá trị như chuỗi đơn giản.

Bạn có thể tưởng tượng mã hóa một Bản đồ thành một chuỗi và sau đó giải mã nó một lần nữa, nhưng nó sẽ đơn giản để lưu trữ trong một tập tin hoặc sự kiện chuyên dụng tốt hơn trong cơ sở dữ liệu.

15

bạn có thể sử dụng @Value.

Thuộc tính file:

users={test1:'test1',test2:'test2'} 

mã Java:

@Value("#{${users}}") 
private Map<String,String> users; 
Các vấn đề liên quan