복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.클래스 패스 리소스이므로 classpath에 $ webapp / WEB-INF / classes라고 입력하십시오.

    클래스 패스 리소스이므로 classpath에 $ webapp / WEB-INF / classes라고 입력하십시오.

    Maven 프로젝트는 webapp을 패키징 할 때 $ module / src / main / resources의 내용을이 위치로 복사합니다. (전자는 소스 경로이고, 후자 - WEB-INF / classes -는 스펙에 따라 서블릿 컨테이너에 의해 항상 클래스 경로에 놓입니다.)

  5. 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