Giải quyết các cạm bẫy mà SpringBoot gặp phải khi sử dụng yaml làm tệp cấu hình
In lạiTác giả: qq735679552Thời gian cập nhật: 27-09-2022 22:32:09264
CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này giải quyết những cạm bẫy mà SpringBoot gặp phải khi sử dụng yaml làm file cấu hình. Nó được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.
Mục lục
Những cạm bẫy gặp phải với SpringBoot yaml dưới dạng tệp cấu hình
lý lịch
Tôi cảm thấy sẽ tốt hơn nếu sửa đổi nó, đại loại như thế này:
Chèn cấu hình SpringBoot-yaml
cú pháp cơ bản yaml
Nghĩa đen: giá trị thông thường [số, boolean, chuỗi]
Đối tượng, Bản đồ (cặp khóa-giá trị)
Mảng (Danh sách, bộ)
Sửa đổi số cổng mặc định của SpringBoot
tập tin cấu hình tiêm yaml
phương pháp ban đầu
phương pháp Yaml
Sử dụng @PropertySource
Sử dụng @configurationProperties
Tóm lại
。
Những cạm bẫy gặp phải với SpringBoot yaml dưới dạng tệp cấu hình
。
lý lịch
Gần đây tôi đã bắt đầu một dự án mới và xây dựng lại khung phát triển dựa trên SpringBoot.
Nguyên nhân của sự cố là khi tôi tiến hành kiểm tra đơn vị dao, nó liên tục bị lỗi. Thông báo lỗi có thể là "thuộc tính maxActive không thể bằng 0 khi tạo dataSource." Dựa trên kinh nghiệm trước đây, có thể thuộc tính cấu hình đã không được tải thành công. Khi khắc phục sự cố lớp thuộc tính cấu hình được chú thích bằng chú thích @ConfigurationProperties, tại sao các thuộc tính trong application.yml không được đưa vào?
Kiểm tra nhật ký gỡ lỗi, tôi tìm thấy một dòng nhật ký rất lạ.
Đã bỏ qua (trống) tệp cấu hình "file:/E:/workspace/union-service/union-service-dao/target/test-classes/application.yml" (classpath:/application.yml)
Rõ ràng là nó không trống rỗng! Tôi nghi ngờ tên tệp bị sai. Tôi đã xác nhận và thử lại nhiều lần nhưng vẫn không được.
@Overridepublic PropertySource> load(String name, Resource resource, String profile) throws IOException {if (ClassUtils.isPresent("org.yaml.snakeyaml.Yaml", null)) { Bộ xử lý processor = new Processor(resource, profile); Map source = processor.process(); if (!source.isEmpty()) { return new MapPropertySource(name, source); }}return null;}
Tìm lớp "org.yaml.snakeyaml.Yaml" và trả về null nếu nó không tồn tại. Việc sửa đổi mã dự án của tôi thật dễ dàng, chỉ cần thêm phần phụ thuộc của Snakeyaml.
Nhưng khi đoạn mã SpringBoot được thực thi ở đây có nghĩa là file tài nguyên đã tồn tại. Bởi vì không có lớp nào để phân tích yaml, hãy bỏ qua nó và tìm các file cấu hình phù hợp khác. nhắc nhở bạn về mật mã bất cẩn và bướng bỉnh thì sao?
。
Tôi cảm thấy sẽ tốt hơn nếu sửa đổi nó, đại loại như thế này:
@Overridepublic PropertySource> load(String name, Resource resource, String profile) throws IOException {if (ClassUtils.isPresent("org.yaml.snakeyaml.Yaml", null)) { Bộ xử lý processor = new Processor(resource, profile); Map source = processor.process(); if (!source.isEmpty()) { return new MapPropertySource(name, source); }} else { logger.warn("Đã tìm thấy " + name + " khi thiếu snakeyaml");}return null;}
Các vấn đề liên quan đã được gửi tới Spring Boot trên github.
。
Chèn cấu hình SpringBoot-yaml
。
cú pháp cơ bản yaml
Lưu ý: Yêu cầu ngữ pháp rất nghiêm ngặt! .
1. Không được bỏ sót dấu cách.
2. Sử dụng thụt lề để kiểm soát các mối quan hệ phân cấp miễn là một cột dữ liệu được căn chỉnh sang trái thì nó ở cùng cấp độ.
3. Trường hợp thuộc tính và giá trị rất nhạy cảm.
。
Nghĩa đen: giá trị thông thường [số, boolean, chuỗi]
Giá trị bằng chữ có thể được viết trực tiếp ở cuối và chuỗi không cần phải được đặt trong dấu ngoặc kép hoặc dấu ngoặc đơn theo mặc định;
k:v。
Để ý:
" " Dấu ngoặc kép sẽ không thoát khỏi các ký tự đặc biệt trong chuỗi và các ký tự đặc biệt sẽ được sử dụng làm ý nghĩa mà chúng muốn diễn đạt;
Ví dụ :
tên yaml: "kuang shen"
Đầu ra:
yaml kang dòng mới shen.
""Dấu ngoặc đơn sẽ thoát khỏi các ký tự đặc biệt và các ký tự đặc biệt cuối cùng sẽ được xuất ra như các ký tự thông thường.
Ví dụ :
tên yaml: 'kuang shen"
Đầu ra:
yaml kung she.
。
Đối tượng, Bản đồ (cặp khóa-giá trị)
#Object, Định dạng bản đồ k: v1: v2:
Viết các thuộc tính và mối quan hệ giá trị của đối tượng trên dòng tiếp theo, chú ý đến vết lõm, ví dụ:
học sinh: tên: qinjiang tuổi: 3
Viết nội tuyến.
học sinh: {name: qinjiang,age: 3}
。
Mảng (Danh sách, bộ)
Sử dụng - value để biểu diễn một phần tử trong mảng, ví dụ:
vật nuôi: - mèo - chó - lợn
Viết nội tuyến.
vật nuôi: [mèo, chó, lợn]
。
Sửa đổi số cổng mặc định của SpringBoot
Bằng cách thêm tham số số cổng vào tệp cấu hình, bạn có thể chuyển đổi cổng;
máy chủ: cổng: 8082
。
tập tin cấu hình tiêm yaml
。
phương pháp ban đầu
1. Tạo một tệp mới application.yml trong thư mục tài nguyên của dự án springboot.
2. Viết một lớp thực thể Dog;
package com.kuang.springboot.pojo;@Component //Đăng ký Bean vào container public class Dog { Private String name; Private Integer age; //Xây dựng có tham số và không có tham số, phương thức get, set, toString() }
3. Hãy nghĩ về cách chúng ta chèn các giá trị thuộc tính vào đậu! @Value, kiểm tra nó trên lớp chó:
@Component // Thành phần beanpublic class Dog { @Value("阿黄") private String name; @Value("18") private Integer age;}
4. Đưa đầu ra của con chó vào lớp kiểm tra SpringBoot;
@SpringBootTestclass DemoApplicationTests { @Autowired // Tự động tiêm con chó vào Dog dog; @Test public void contextLoads() { System.out.println(dog);
Kết quả được xuất thành công và @Value được chèn thành công. Đây là phương thức ban đầu.
。
phương pháp Yaml
Chúng tôi đang viết một lớp thực thể: Lớp người.
@Component // Đăng ký đậu vào vùng chứa công khai lớp Person { tên chuỗi riêng tư; số nguyên riêng tư hạnh phúc; riêng tư Ngày sinh; bản đồ riêng tư; / /Xây dựng có tham số và không có tham số, phương thức get, set, phương thức toString() }
Sử dụng cấu hình yaml để tiêm Hãy chú ý đến sự khác biệt và ưu điểm khi viết cấu hình yaml! .
Tất cả các giá trị của đối tượng người đã được ghi và bây giờ là lúc đưa chúng vào lớp.
/* Hàm @ConfigurationProperties: Ánh xạ giá trị của từng thuộc tính được định cấu hình trong tệp cấu hình tới thành phần này; yêu cầu SpringBoot liên kết tất cả các thuộc tính trong lớp này với cấu hình có liên quan trong tệp cấu hình. người trong tệp cấu hình một đối một */@Component //Đăng ký Bean@ConfigurationProperties(prefix = "person")public class Person { Private String name; Private Integer age; Ngày sinh; Bản đồ riêng bản đồ; Danh sách riêng tư
Sau khi xác nhận cấu hình trên, hãy kiểm tra nó trong lớp kiểm tra.
@SpringBootTestclass DemoApplicationTests { @Autowired Person Person; // Tự động tiêm người @Test public void contextLoads() { System.out.println(person);
Kết quả: Tất cả các giá trị đã được chèn thành công.
Tải tập tin cấu hình được chỉ định.
@PropertySource: Tải tệp cấu hình được chỉ định;
@configurationProperties: Theo mặc định, giá trị được lấy từ tệp cấu hình chung;
。
Sử dụng @PropertySource
1. Tạo tệp Person.properties mới trong thư mục tài nguyên.
tên=quan thần
2. Sau đó chỉ định trong mã để tải tệp Person.properties.
@PropertySource(value = "classpath:person.properties")@Component // Sử dụng beanpublic class Person { @Value("${name}") private String name; ...... }
3. Kiểm tra lại đầu ra: tệp cấu hình được chỉ định đã được liên kết thành công.
。
Sử dụng @configurationProperties
Được sử dụng với các tập tin yaml, vui lòng xem chương trình trên để biết chi tiết.
。
Tóm lại
Giá trị có thể đạt được bằng cách định cấu hình yml và định cấu hình thuộc tính yml;
Nếu chúng ta đang kinh doanh một số ngành nghề nhất định và chỉ cần lấy một giá trị nhất định trong tệp cấu hình, chúng ta có thể sử dụng @value;.
Nếu chúng tôi đặc biệt viết JavaBean để ánh xạ 1-1 với tệp cấu hình, chỉ cần @configurationProperties trực tiếp, đừng ngần ngại! .
Trên đây là kinh nghiệm cá nhân của mình, hi vọng có thể cho các bạn tham khảo và mong các bạn có thể ủng hộ mình.
Link gốc: https://my.oschina.net/bfleeee/blog/879209.
Cuối cùng, bài viết về cách giải quyết những cạm bẫy mà SpringBoot gặp phải khi sử dụng yaml làm tệp cấu hình sẽ kết thúc tại đây. Nếu bạn muốn biết thêm về cách giải quyết những cạm bẫy mà SpringBoot gặp phải khi sử dụng yaml làm tệp cấu hình, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục. bài viết, hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Lời nói đầu: Daily Standup là hoạt động thực hành Agile diễn ra vào một thời điểm cố định với nhịp điệu thống nhất cho cả nhóm và giúp nhóm nhanh chóng đồng bộ tiến độ: Mục đích của Standup là giúp nhóm bám sát mục tiêu Sprint tốt hơn;
Python là một ngôn ngữ rõ ràng và súc tích nếu bạn không hiểu một số chi tiết, bạn sẽ rơi vào những “hố sâu” không đáy. Dưới đây, tôi sẽ tổng hợp lại một số lỗi phổ biến trong Python. Tạo danh sách và tham chiếu việc tạo danh sách lồng nhau sử dụng dấu * để tạo
Ngày nay, việc thiết lập một hệ thống bảo mật trong DevOps trở nên quan trọng hơn bao giờ hết. "Báo cáo cải thiện kỹ năng DevOps doanh nghiệp năm 2021" chỉ ra rằng 56% số người được hỏi cho rằng DevSecOps đã trở thành một yếu tố cần thiết trong các công cụ tự động hóa. Tuy nhiên, D
Lời nói đầu Tôi tin rằng sau khi xem chủ đề này, mọi người có thể nghĩ rằng đó là một chủ đề sáo rỗng về kinh nguyệt. Trên thực tế, về cơ bản bạn có thể hiểu các tình huống khác nhau bằng cách nắm bắt "sự chuyển giao giá trị", nhưng gần đây tôi gặp phải một "hố nhỏ" sâu hơn và tôi muốn chia sẻ nó với bạn. Trước hết hãy bắt đầu với điều đơn giản nhất
Lời nói đầu Sự kết hợp for range trong Go có thể được triển khai một cách thuận tiện để duyệt qua một mảng hoặc lát cắt. Tuy nhiên, trong một số trường hợp, bạn có thể bị "mắc kẹt" khi sử dụng for range. Đây là một đoạn mã để mô phỏng nó:
Xin chào mọi người, tôi là Anh Minh. Trước khi bắt đầu, hãy để tôi hỏi bạn một câu hỏi cổ điển rất đậm chất Go: Làm thế nào để xác định xem giá trị của một giao diện{} có bằng không không? Đây cũng là một câu hỏi có thể được hỏi trong các cuộc phỏng vấn. Câu hỏi này rất "bí ẩn". ". Thường xuyên
Phần lớn gói ava concurrency là về các container đồng thời nên cần phải tìm hiểu và hiểu rõ phần này. Mặc dù bộ chứa đồng bộ hóa được cung cấp trước Java 1.5 cũng có thể đảm bảo an toàn cho luồng nhưng hiệu suất của nó rất kém và tính đồng thời được cung cấp sau phiên bản Java 1.5
Xin chào mọi người, tôi là cá chiên. Cách đây vài ngày, tôi thấy một người bạn trong nhóm trao đổi độc giả có nghi ngờ lớn về việc sử dụng giao diện. Thật trùng hợp, tôi cũng thấy trên mạng có một người bạn được hỏi trong buổi phỏng vấn ở Go:
Tôi là một lập trình viên xuất sắc, rất giỏi!