[SPRING] 참조하는 Java 프로젝트에서 정적 리소스 (WEB-INF) 폴더의 파일에 액세스하는 방법?
SPRING참조하는 Java 프로젝트에서 정적 리소스 (WEB-INF) 폴더의 파일에 액세스하는 방법?
Spring Bean으로 노출 된 내 응용 프로그램 서비스 중 하나에 대한 구성 XML 파일을 포함하는 웹 응용 프로그램이 있습니다. 또한 Spring WorkContext 프레임 워크를 사용하여 테스트를 실행하고 테스트 중 하나가 해당 XML 파일의 구성을 검사하는 독립 실행 형 Java 응용 프로그램 (동일한 웹 응용 프로그램 프로젝트를 해당 pom.xml에서 참조 함)을 동일한 작업 영역에서 사용합니다.
그러나 독립 실행 형 응용 프로그램에서이 xml 파일에 액세스하는 데 문제가 있습니다.
테스트를 설정하기 전에 이전 구성에서 파일은 ServletContext를 통해 액세스되었으며 WEB-INF / 폴더에있었습니다. 그러나 테스트 프로젝트에서 액세스 할 수있게하려면 소스 / 폴더로 이동하고 ServletContext 대신 getClassLoader (). getResourceAsStream () 메서드를 사용하여로드해야했습니다. 그러나 파일을 편집 할 때마다 응용 프로그램을 재배포해야하기 때문에 성가신 방법입니다.
WEB-INF / 폴더에 파일을 보관할 수 있지만 테스트 실행 중에 참조하는 프로젝트에서로드 할 수 있습니까?
추신 현재 Tomcat 서버가있는 STS 프로젝트입니다.
해결법
-
==============================
1.그것이 WEB-INF / 폴더 아래에 있다면 파일을 보관해야합니다.
그것이 WEB-INF / 폴더 아래에 있다면 파일을 보관해야합니다.
명령 줄에서 실행중인 테스트 클래스 용. getClassLoader (). getResource ()는 클래스 경로의 루트에있는 파일 (예 : application.properties 파일)에 사용할 수 있습니다. 거기에서 프로젝트의 구조와 속성 파일에 대한 WEB-INF / 위치를 알 수 있습니다. URL을 반환하기 때문에 찾고있는 XML 파일의 경로를 알아낼 수 있습니다.
URL url = this.getClass().getClassLoader().getResource("application.properties"); System.out.println(url.getPath()); File file = new File(url.getFile()); System.out.println(file); // now use the Files' path to obtain references to your WEB-INF folder
이 기능이 유용하게 사용되기를 바랍니다. 나는 당신의 테스트 수업이 어떻게 진행되고 있는지에 대한 가정을해야만했다.
파일 클래스를 살펴보고 getPath (), getAbsolutePath () 및 getParent () 메소드를 사용할 수 있습니다.
-
==============================
2.테스트를 실행하기 전에 Spring MockServletContext 클래스를 사용하여 서비스 bean에 직접 주입했다. ServletContextAware를 구현했다.
테스트를 실행하기 전에 Spring MockServletContext 클래스를 사용하여 서비스 bean에 직접 주입했다. ServletContextAware를 구현했다.
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "/test-ctx.xml" } ) public class SomeServiceTest { @Autowired private MyServletContextAwareService myService; @Before public void before(){ //notice that I had to use relative path because the file is not available in the test project MockServletContext mockServletContext = new MockServletContext("file:../<my web project name>/src/main/webapp"); myService.setServletContext(mockServletContext); }
Servlet Context를 사용하는 클래스가 여러 개있는 경우 더 나은 해결책은 현재 DelegatingSmartContextLoader에서 제공하는 WebApplicationContext 대신 WebApplicationContext를 사용하는 것이지만 사용자 정의 ContextLoader 클래스를 구현하고 클래스 이름을 @ContextConfiguration 주석으로 전달해야합니다.
나중에 마음에 들었던 대안적이고 다소 깔끔한 해결책은 서비스를 리팩터링하고 ServletContextAware를 망치는 대신 @Autowired를 통해 ServletContext를 삽입하고 해당 유형의 빈 (사실상 MockServletContext 인스턴스)을 제공하는 것이다.
앞으로는 테스트 클래스의 MockServletContext에 대한 직접적인 지원이 스프링에 추가 될 것입니다 (SPR-5399 및 SPR-5243 참조).
스프링 3.2 업데이트 Spring 3.2에서 서블릿 컨텍스트의 초기화는 @WebAppConfiguration 어노테이션 하나를 추가하는 것처럼 간단 해졌다.
@RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration("file:../<my web project name>/src/main/webapp") @ContextConfiguration(locations = { "/test-ctx.xml" } ) public class SomeServiceTest {
기사의 자세한 내용보기
-
==============================
3.Maven 프로젝트에서 나는 동일한 문제를 겪었다. servletContext가없고 정적 파일에 액세스 할 수 없습니다. WEB-INF 디렉토리. 나는 pom.xml에 항목을 추가하여 해결책을 찾았고, 디렉토리에 대한 액세스 권한을 부여 받았다. 실제로는 클래스 패스에 대한이 경로를 포함합니다.
Maven 프로젝트에서 나는 동일한 문제를 겪었다. servletContext가없고 정적 파일에 액세스 할 수 없습니다. WEB-INF 디렉토리. 나는 pom.xml에 항목을 추가하여 해결책을 찾았고, 디렉토리에 대한 액세스 권한을 부여 받았다. 실제로는 클래스 패스에 대한이 경로를 포함합니다.
추신 : 나는 Tomcat 컨테이너를 사용하고 있었다.
<project> <build> <resources> <resource> <directory>src/main/webapp/WEB-INF</directory> </resource> </resources> </project>
-
==============================
4.클래스 패스 리소스이므로 classpath에 $ webapp / WEB-INF / classes라고 입력하십시오.
클래스 패스 리소스이므로 classpath에 $ webapp / WEB-INF / classes라고 입력하십시오.
Maven 프로젝트는 webapp을 패키징 할 때 $ module / src / main / resources의 내용을이 위치로 복사합니다. (전자는 소스 경로이고, 후자 - WEB-INF / classes -는 스펙에 따라 서블릿 컨테이너에 의해 항상 클래스 경로에 놓입니다.)
from https://stackoverflow.com/questions/10638790/how-to-access-file-in-the-static-resourcesweb-inf-folder-from-the-referencing by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] oauth2와 함께 스프링 클라우드 게이트웨이 사용 (0) | 2019.04.30 |
---|---|
[SPRING] Spring 3.1 MVC 애플리케이션의 HTTP 상태 404 (0) | 2019.04.30 |
[SPRING] Spring 데이터 JPA @OneToOne 주석 무한 재귀 오류 (0) | 2019.04.30 |
[SPRING] 단일 파일에 대한 Maven 리소스 필터링 (0) | 2019.04.30 |
[SPRING] Spring에서 setAllowedFields () 메소드 사용하기 (0) | 2019.04.30 |