Trong ứng dụng Spring 3.0 của tôi, tôi có một số tài nguyên trong /WEB-INF/dir
. Khi chạy, tôi cần một số trong số đó là InputStream
(hoặc một số loại khác). Làm thế nào tôi có thể lấy chúng? Có thể tiêm chúng như là một bình thường Resource
?Spring 3.0 tiêm các tệp dưới dạng tài nguyên
Trả lời
Dưới đây là một cách dễ nhất để làm điều đó thông qua chú thích:
import org.springframework.core.io.Resource;
@Value("classpath:<path to file>")
private Resource cert;
Bạn sẽ có thể sử dụng:
Resource resource = appContext.getResource("classpath:<your resource name>");
InputStream is = resource.getInputStream();
nơi appContext
là mùa xuân của bạn ApplicationContext
(cụ thể là, một WebApplicationContext, kể từ khi bạn có một webapp)
Lệnh ' Giao diện Resource' không khai báo phương thức 'getInputStream()', bạn sẽ cần phải gọi 'new FileInputStream (resource.getFile())'. –
Không chính xác. 'Tài nguyên' thừa hưởng nó từ giao diện' org.springframework.core.io.InputStreamSource' – Saket
Lỗi của tôi, xin lỗi, không thấy 'hàm thực thi'. –
Nếu bạn không muốn giới thiệu sự phụ thuộc vào mùa xuân , hãy làm theo cách tiếp cận chi tiết tại đây: Populate Spring Bean's File field via Annotation
Tôi không thấy làm thế nào bất kỳ câu trả lời cho câu hỏi đó dẫn đến giảm sự phụ thuộc vào mùa xuân ... –
Tôi đồng ý rằng việc sử dụng @Value không phải là phụ thuộc vào mùa xuân. –
Nhưng chú thích là cách tốt nhất để đạt được tiêm xuân mà không vi phạm nguyên tắc không lặp lại. Cách tiếp cận XML, mà bạn đề nghị, buộc bạn lặp lại chính mình. Sớm hay muộn ai đó sẽ thay đổi tên thuộc tính trong tệp java và quên cập nhật tệp định nghĩa bean mùa xuân. –
Tất cả ApplicationContext
s, theo định nghĩa, ResourceLoader
s. Điều này có nghĩa là chúng có khả năng giải quyết bất kỳ chuỗi tài nguyên nào được tìm thấy trong cấu hình của chúng. Với điều này trong tâm trí, bạn có thể khai báo bean mục tiêu của bạn với một setter chấp nhận một org.springframework.core.io.Resource
. Sau đó, khi bạn cấu hình bean mục tiêu, chỉ cần sử dụng đường dẫn tài nguyên trong giá trị cho thuộc tính. Spring sẽ cố gắng chuyển đổi giá trị String
trong cấu hình của bạn thành Resource
.
public class Target {
private Resource resource;
public void setResource(final Resource resource) {
this.resource = resource;
}
}
//configuration
<beans>
<bean id="target" class="Target">
<property name="resource" value="classpath:path/to/file"/>
</bean>
</beans>
Dưới đây là ví dụ đầy đủ để truy xuất tài nguyên đường dẫn lớp. Tôi sử dụng nó để lấy file SQL có truy vấn thực sự phức tạp mà tôi không muốn để lưu trữ trong các lớp Java:
public String getSqlFileContents(String fileName) {
StringBuffer sb = new StringBuffer();
try {
Resource resource = new ClassPathResource(fileName);
DataInputStream in = new DataInputStream(resource.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null) {
sb.append(" " + strLine);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
Điều đó khá thú vị! – Kong
Bất kỳ ý tưởng nào về cách thư mục có thể được tải? Ví dụ: một thư mục "dir" chứa 25 tệp –
Điều đó khá thú vị nhưng có thể không hoạt động bên trong tệp jar. –