Внедрить файловый ресурс в бин Spring - PullRequest
7 голосов
/ 02 сентября 2011

Каков хороший способ добавить некоторый файловый ресурс в бин Spring? Теперь я autowire ServletContext и использовать, как показано ниже. Есть ли более элегантный способ сделать это в Spring MVC?

@Controller
public class SomeController {

    @Autowired
    private ServletContext servletContext;

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

Ответы [ 3 ]

6 голосов
/ 03 сентября 2011

Примерно так:

@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 id="..." class="x.y.SomeController">
   <property name="resource" value="/WEB-INF/file.txt"/>
</bean>

Это создаст ServletContextResource с использованием пути /WEB-INF/file.txt и вставит его в ваш контроллер.

Обратите внимание, что вы не можете использовать компонентное сканирование для обнаружения вашего контроллера, используя эту технику, вам нужно явное определение компонента.

1 голос
/ 26 июля 2016

Или просто используйте аннотацию @Value.

Для одного файла:

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

Для нескольких файлов:

@Value("classpath*:conf/about.*")
private Resource[] abouts;
1 голос
/ 02 сентября 2011

Для чего вы собираетесь использовать ресурс?В вашем примере вы ничего с этим не делаете.

Однако из его названия похоже, что вы пытаетесь загрузить сообщения интернационализации / локализации - для чего вы можете 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" />

Какой мой любимый способ сделать это - только кажется чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...