简体   繁体   中英

declaration can be found for element 'context:property-placeholder'. Spring 4

I browsed around 30 webpages and 50 articles about this and it's still not working.

Here is my code its really simple I'm only a Spring beginner.

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>

And in resources folder is my application.properties file which contains only app.name=Phil

Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 12 in XML document from class path resource [SpringBeans.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 12; columnNumber: 81; cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'context:property-placeholder'.

I really tried most of solutions which I found at stackoverflow and few other forums. I`m really new in spring and I will appreciate any help.

I am unable to comment - What i see is you are writing : <context:property-placeholder location="classpath*:application.properties"/>

Why is there a * after classpath. It should work with - <context:property-placeholder location="classpath:application.properties"/>

Else -

You can use -

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

In you Heloworld bean

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

In your springbeans.xml you've specified the location as "classpath*:application.properties" classpath with a * whereas in your HelloWorldService.java you've specified the location as "classpath:application.properties" . There is a discrepancy in the two locations.

Besides the problem lies in the SpringBeans.xml schema declaration. It is incorrect & incomplete. After the context declaration http://www.springframework.org/schema/context/spring-context-4.0.xsd is missing check this this & this

Ideally it should be

<?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">

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM