我无法找到xml文件的文件/类路径。我尝试了绝对路径并弹出classpath*:
ApplicationContext ctx =
new ClassPathXmlApplicationContext();
private Resource resource = this.ctx.getResource("classpath*:validation.xml");
在构造函数中我有:
public Validator() {
if(this.resource.exists()){
System.out.println("FOUND!!!!!!!!!!!!!!!!!!!!"+resource);
}else{
System.out.println("NOT FOUND");
}
this.runInputStream();
}
我的validation.xml
文件位于不同名称的两个地方。我试图找出它没有加载或被发现的地点和原因。
我在GIT上发布了该项目.... GitHub Link
---------------------更新1 ------------------------ ---
我已将以下内容添加到我的pom
文件中:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
</plugin>
</plugins>
</build>
它似乎已经找到/已经初始化但是类没有,它给了我一个空指针异常就像以前一样。
更新代码:
@Configuration
public class Validator {
private InputStream forms;
private ValidatorResources resources;
private Resource validationResource;
ApplicationContext ctx =
new ClassPathXmlApplicationContext();
@PostConstruct
public void init(){
validationResource = ctx.getResource("classpath*:validation.xml");
}
public Validator() {
this.runInputStream();
}
private void runInputStream(){
try{
this.forms = this.validationResource.getInputStream();
this.resources = new ValidatorResources(this.forms);
}catch (IOException ex) {
System.out.println("Error in Validator.Class-----runInputStream IOException: "+ex);
}catch (SAXException e) {
System.out.println("Error in Validator.Class-----runInputStream SAXException: "+e);
}catch (Exception e){
System.out.println("Error in Validator.Class-----------"+e);
}
}
}
答案 0 :(得分:1)
问题是 src / main / resources / validation.xml 未打包到war文件中。
替换&lt;构建&GT; pom中的部分:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
</plugin>
</plugins>
</build>
这样,所有Maven项目的默认资源目录src / main / resources将最终出现在目标/类和WAR中的WEB-INF / classes中。
答案 1 :(得分:1)
首先删除trailing / in resources部分。资源部分应该相对于构建目录。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/webapp/WEB-INF/config</directory>
</resource>
</resources>
</build>
接下来修改Validator.java
@Configuration
public class Validator implements InitializingBean {
@Autowired
private ApplicationContext applicationContext;
@Override
public void afterPropertiesSet() throws Exception {
Resource resource = applicationContext.getResource("validation.xml");
if(this.resource.exists()){
System.out.println("FOUND!!!!!!!!!!!!!!!!!!!!"+resource);
}else{
System.out.println("NOT FOUND");
}
}
有关详细信息,请参阅InitializingBean。另一种方法是使用ApplicationContextAware,如下所示:
@Configuration
public class Validator implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
Resource resource = applicationContext.getResource("classpath:validation.xml");
if(this.resource.exists()){
System.out.println("FOUND!!!!!!!!!!!!!!!!!!!!"+resource);
}else{
System.out.println("NOT FOUND");
}
}
构建项目,然后在tomcat中部署war。你应该看到像
这样的东西22-May-2017 10:57:38.658 INFO [localhost-startStop-1] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions Loading XML bean definitions from ServletContext resource [/WEB-INF/config/application-context.xml] FOUND!!!!!!!!!!!!!!!!!!!!class path resource [validation.xml]
答案 2 :(得分:1)
我注意到的第一件事是你试图在现场一级获取资源。换句话说,这个:
public class SomeClass{
ApplicationContext ctx = new ClassPathXmlApplicationContext();
private Resource resource = this.ctx.getResource("classpath:validation.xml");
}
会让我觉得应用程序上下文没有完全初始化。
在下拉项目并检查后,我的假设是正确的。在初始化类之前,ApplicationContext
未完全初始化。要解决这个问题,您可以使用@PostConstruct
注释。你的班级现在看起来像这样:
@Configuration
public class Validator {
@Autowired
private ApplicationContext applicationContext;
private Resource validationResource;
@PostConstruct
public void init(){
validationResource = applicationContext.getResource("classpath*:validation.xml");
}
另外,我建议您花一些时间来正确配置您的pom。理想情况下,某人应该能够下载代码,构建和运行。由于手动配置,我花了一些时间让您的项目在本地运行。
答案 3 :(得分:0)
你可以尝试:
URL resource = ClassLoader.getSystemClassLoader().getResource("validation.xml");
如果有URL
可用,那么就可以获得Resource
。如果没有找到资源,它将返回null。