2011-09-02 4 views
5

Spring bean에 파일 리소스를 주입하는 좋은 방법은 무엇입니까? 이제 ServletContext를 autowire하고 아래와 같이 사용하십시오. 스프링 MVC에서보다 우아한 방법이 있나요?Spring bean에 파일 리소스 주입하기

@Controller 
public class SomeController { 

    @Autowired 
    private ServletContext servletContext; 

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

답변

5

뭔가 : 당신의 빈 정의에서

@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> 

이것은 /WEB-INF/file.txt 경로를 사용하여 ServletContextResource를 만들고, 컨트롤러에이를 주입합니다.

참고이 기술을 사용하여 구성 요소 검색을 사용하여 컨트롤러를 검색 할 수 없으므로 명시 적 bean 정의가 필요합니다.

1

리소스를 어떻게 사용 하시겠습니까? 당신의 예에서 당신은 아무것도하지 않습니다.

그러나 국제화/현지화 메시지를로드하려고 시도하는 것처럼 보입니다.이 메시지는 MessageSource입니다. 이 유사 (아마도 별도의 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> 

봄은 자원 번들하면 응용 프로그램이 시작로드됩니다. 그런 다음 컨트롤러에 MessageSource를 autowire하기 및 지역화 된 메시지를 얻을하는 데 사용할 수 있습니다 :

@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" /> 

- 단지 청소기 것입니다. 이 같은

+0

내가 MessageSource를 알고있다. 'messages_en.properties'는 단지 예일뿐입니다. 실수를 피하기 위해 이것을 변경했습니다. – marioosh

+0

아, 좋아. 글쎄, 당신이 그 파일을 사용하는 것에 달려 있다고 생각합니다. .properties 파일이나 L18n 메시지와 같이 상당히 표준적인 것이라면 (messageSource와 같은) 좀 더 깔끔한 방법 일 가능성이 높습니다. 그러나 파일을 일부 맞춤식으로 사용하는 경우 특정 방식으로 볼 수 없습니다. 당신이하고있는 것에 대한 문제. – Russell

0

또는 @Value 주석을 사용하십시오. 하나의 파일에 대한

:

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

여러 파일의 경우 :

@Value("classpath*:conf/about.*") 
private Resource[] abouts;