将一些文件资源注入Spring bean的好方法是什么? 现在我自动装配ServletContext并使用如下所示。在Spring MVC中更优雅的方式吗?
@Controller
public class SomeController {
@Autowired
private ServletContext servletContext;
@RequestMapping("/texts")
public ModelAndView texts() {
InputStream in = servletContext.getResourceAsStream("/WEB-INF/file.txt");
// ...
}
}
答案 0 :(得分:6)
这样的事情:
@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();
}
}
在你的bean定义中:
<bean id="..." class="x.y.SomeController">
<property name="resource" value="/WEB-INF/file.txt"/>
</bean>
这将使用ServletContextResource
路径创建/WEB-INF/file.txt
,并将其注入您的控制器。
请注意,您无法使用组件扫描来检测使用此技术的控制器,您需要一个明确的bean定义。
答案 1 :(得分:1)
您打算如何使用该资源?在你的例子中,你不做任何事情。
从它的名字来看,您似乎正在尝试加载国际化/本地化消息 - 您可以MessageSource
。
如果您定义了一些类似于此的bean(可能在单独的messages-context.xml
中):
<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>
Spring将在应用程序启动时加载资源包。然后,您可以将MessageSource
自动装入控制器并使用它来获取本地化消息:
@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。将Locale
作为参数添加到控制器方法将导致Spring神奇地将其连接到 - 这就是你需要做的全部。
然后,您还可以使用以下命令访问JSP中资源包中的消息:
<spring:message code="my.message.key" />
这是我喜欢的方式 - 看起来更干净。
答案 2 :(得分:1)
或者只使用@Value
注释。
对于单个文件:
@Value("classpath:conf/about.xml")
private Resource about;
对于多个文件:
@Value("classpath*:conf/about.*")
private Resource[] abouts;