可以找到元素"context:property-placeholder"的声明。春季 4



我浏览了大约30个网页和50篇关于这个的文章,但仍然不起作用

这是我的代码,它真的很简单,我只是一个Spring初学者。

App.java

package com.procus.spring.simple.simple;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 *
 * @author procus
 */
public class App {
    public static void main(String[] args) {
        ApplicationContext con = new ClassPathXmlApplicationContext("SpringBeans.xml");
        SampleSimpleApplication sam = (SampleSimpleApplication) con.getBean("sam");
        sam.run(args);
    }
}

SampleSimpleApplication.java

package com.procus.spring.simple.simple;
import com.procus.calculator.basic.BasicCalculator;
import com.procus.spring.simple.simple.service.HelloWorldService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackageClasses = BasicCalculator.class)
public class SampleSimpleApplication implements CommandLineRunner {

    // intentional error
    @Autowired
    BasicCalculator calculator;

    // Simple example shows how a command line spring application can execute an
    // injected bean service. Also demonstrates how you can use @Value to inject
    // command line args ('--name=whatever') or application properties
    @Autowired
    private HelloWorldService helloWorldService;
        public SampleSimpleApplication() {
        }

    @Override
    public void run(String... args) {
        System.out.println(this.helloWorldService.getHelloMessage());
    }
    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleSimpleApplication.class, args);
    }
}

HelloWorldService.java

package com.procus.spring.simple.simple.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.stereotype.Component;
@Component
@Configuration
@PropertySource(value = { "classpath:application.properties" })
public class HelloWorldService {
    @Value("${app.name:World}")
    private String name;

    public String getHelloMessage() {
        return "Hello " + this.name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

SpringBeans.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<context:property-placeholder location="classpath*:application.properties"/>
    <bean id="DBProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations">
        <value>classpath*:application.properties</value>
      </property>
    </bean>
    <bean id="sam" class="com.procus.spring.simple.simple.SampleSimpleApplication"/>
    <bean id="serv" class="com.procus.spring.simple.simple.service.HelloWorldService">
        <property name="name" value="Jano" />
    </bean>
    <bean id="calc" class="com.procus.calculator.basic.BasicCalculator">
        <constructor-arg value="1.0"/>
    </bean>

</beans>

资源文件夹中是我的应用程序。app.name=Phil

main线程异常org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:来自类路径资源[SpringBeans.xml]的XML文档中的第12行是无效的;嵌套异常是org.xml.sax.SAXParseException;lineNumber: 12个;columnNumber: 81;cvc-complex-type.2.4.c:匹配通配符是严格的,但是找不到元素的声明背景:property-placeholder。

我真的尝试了我在stackoverflow和其他一些论坛上找到的大多数解决方案。

springbeans.xml中,您已将位置指定为"classpath*:application.properties"类路径,而在HelloWorldService.java中,您已将位置指定为"classpath:application.properties"。这两个地点不一致。

此外,问题出在SpringBeans.xml模式声明中。这是不正确的&不完整的。在上下文声明之后,缺少http://www.springframework.org/schema/context/spring-context-4.0.xsd检查一下这个& &;这个

理想情况下应该是

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.0.xsd">

我无法评论-我看到的是你在写:<context:property-placeholder location="classpath*:application.properties"/>

为什么类路径后面有一个*。它应该使用- <context:property-placeholder location="classpath:application.properties"/>

其他

你可以使用-

    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
  <property name="locations">
    <list>
      <value>classpath:application.properties</value>
    </list>
  </property>
  <property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>

在你的Heloworld bean

 <bean id="helloworld" class ="package.HelloWorldService" >
         <property name="name" value="${app.name}" />
    </bean>

最新更新