Я обновляю Spring 2.5 до 4.2. Проблема связана с одним компонентом, который имеет тип свойства org.springframework.core.io.ClassPathResource
. Значение ресурса определяется в xml как p:location="classpath:/<the resource path>"
Это сработало отлично, и свойство bean-компонента было заполнено ресурсом. Но в 4.2 значение не устанавливается.
Поэтому я отладил код и обнаружил, что класс org.springframework.beans.BeanWrapperImpl
манипулировал значением и удалял строку classpath:
из фактического значения в Spring 2.5.
Однако то же самое не верно в 4.2, и класс org.springframework.beans.BeanWrapperImpl
не изменяет значение, в результате чего spring не находит ресурс.
Кто-нибудь сталкивался с подобной ситуацией? Какое решение вы применили?
Спасибо, Ханумант.
EDIT 1: пример кода
конфигурационный файл весны
<bean class="com.test.sample.TestBean" id="testBean"
p:schemaLocation="classpath:/com/test/sample/Excalibur_combined.xsd" />
TestBean.java
public class TestBean {
private ClassPathResource schemaLocation;
public ClassPathResource getSchemaLocation() {
return schemaLocation;
}
public void setSchemaLocation(ClassPathResource schemaLocation) {
this.schemaLocation = schemaLocation;
}
}
App.java
public class App {
public static void main(String[] args) {
ApplicationContext ap = new ClassPathXmlApplicationContext("classpath:/com/test/sample/spring-config.xml");
TestBean tb = (TestBean) ap.getBean("testBean");
try {
URL url = tb.getSchemaLocation().getURL();
System.out.println(url);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Сообщение об ошибке
INFO: Loading XML bean definitions from class path resource
[com/test/sample/spring-config.xml] java.io.FileNotFoundException:
class path resource
[classpath:/com/test/sample/Excalibur_combined.xsd] cannot be resolved
to URL because it does not exist at
org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:187)> at com.test.sample.App.main(App.java:20)
Однако, если я удалю classpath:
из определения компонента, это сработает.
Итак, необходимо ли classpth:
в XML-файле определения бина ?? И почему в Spring 2.5 все работало нормально??
Resource
, а не конкретный тип. Если он не может быть загружен, это потому, что он не существует в этом месте (об этом говорит вам исключение). Так что я предполагаю, что что-то еще изменилось в вашей структуре (и, возможно, вы обновляете не только spring, но и другие фреймворки/инструменты). - person M. Deinum   schedule 15.06.2016ResourceLoader
используется для загрузки фактического ресурса, аclasspath:
теперь является триггером, определяющим, откуда загружать. Если вы используете определенный тип, этот механизм не срабатывает, и строка напрямую передается в ресурс. Это работало в более старых версиях из-за хака, который вы обнаружили ранее. - person M. Deinum   schedule 15.06.2016