2011-09-02 44 views
5

Cách tốt nhất để đưa một số tài nguyên tệp vào Spring bean là gì? Bây giờ tôi autowire ServletContext và sử dụng như dưới đây. Là cách thanh lịch hơn để làm điều đó trong Spring MVC?Tiêm một tài nguyên tệp vào Spring bean

@Controller 
public class SomeController { 

    @Autowired 
    private ServletContext servletContext; 

    @RequestMapping("/texts") 
    public ModelAndView texts() { 
     InputStream in = servletContext.getResourceAsStream("/WEB-INF/file.txt"); 
     // ... 
    } 
} 

Trả lời

5

Something như thế này:

@Controller 
public class SomeController { 

    private Resource resource; 

    public void setResource(Resource resource) { 
     this.resource = resource; 
    } 

    @RequestMapping("/texts") 
    public ModelAndView texts() { 
     InputStream in = resource.getInputStream(); 
     // ... 
     in.close(); 
    } 
} 

Trong định nghĩa bean của bạn:

<bean id="..." class="x.y.SomeController"> 
    <property name="resource" value="/WEB-INF/file.txt"/> 
</bean> 

này sẽ tạo ra một ServletContextResource sử dụng con đường /WEB-INF/file.txt, và tiêm đó vào điều khiển của bạn.

Lưu ý rằng bạn không thể sử dụng tính năng quét thành phần để phát hiện bộ điều khiển của mình bằng kỹ thuật này, bạn cần định nghĩa bean rõ ràng.

1

Bạn định sử dụng tài nguyên để làm gì? Trong ví dụ bạn không làm bất cứ điều gì với nó.

Từ tên của nó, tuy nhiên, có vẻ như bạn đang cố gắng tải các thông điệp quốc tế hóa/bản địa hóa - mà bạn có thể là MessageSource.

Nếu bạn xác định một số đậu (có thể là trong một riêng biệt messages-context.xml) tương tự như sau:

<bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>WEB-INF/messages/messages</value> 
     </list> 
    </property> 
</bean> 

<bean id="localeChangeInterceptor" 
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
    <property name="paramName" value="lang" /> 
</bean> 

<bean id="localeResolver" 
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> 
    <property name="defaultLocale" value="en_GB" /> 
</bean> 

mùa xuân sẽ được tải bó tài nguyên của bạn khi bạn ứng dụng khởi động. Sau đó, bạn có thể autowire các MessageSource vào bộ điều khiển của bạn và sử dụng nó để có được thông điệp bản địa hoá:

@Controller 
public class SomeController { 

    @Autowired 
    private MessageSource messageSource; 

    @RequestMapping("/texts") 
    public ModelAndView texts(Locale locale) { 
     String localisedMessage = messageSource.getMessage("my.message.key", new Object[]{}, locale) 
     /* do something with localised message here */ 
     return new ModelAndView("texts"); 
    } 
} 

NB. thêm Locale làm tham số cho phương thức điều khiển của bạn sẽ khiến cho Spring kết nối nó một cách kỳ diệu - đó là tất cả những gì bạn cần làm.

Bạn cũng có thể sau đó truy cập các tin nhắn trong gói tài nguyên của bạn trong JSP của bạn sử dụng:

<spring:message code="my.message.key" /> 

Đó là cách ưa thích của tôi để làm điều đó - chỉ có vẻ sạch hơn.

+0

Tôi biết MessageSource. 'messages_en.properties' chỉ là ví dụ. Tôi đã thay đổi điều này để tránh những sai lầm. – marioosh

+0

Ah, ok. Vâng, tôi đoán nó phụ thuộc vào những gì bạn sẽ sử dụng tập tin cho. Nếu nó là một thứ khá chuẩn như một tệp tin .properties hoặc L18n thì rất có thể sẽ có một cách cụ thể để thực hiện nó (như messageSource) nhưng nếu bạn đang sử dụng các tệp theo một cách riêng biệt nào đó, tôi không thấy vấn đề với những gì bạn đang làm. – Russell

0

Hoặc chỉ sử dụng chú thích @Value.

Đối với tập tin duy nhất:

@Value("classpath:conf/about.xml") 
private Resource about; 

Đối với nhiều file:

@Value("classpath*:conf/about.*") 
private Resource[] abouts; 
Các vấn đề liên quan