0

Spring を PropertyPlaceholderConfigurer と共に使用して .properties ファイルをロードし、@Value を使用してそれらの値を変数または何らかのオブジェクトに格納する方法を理解しています。

ただし、キーが異なる場合に、ネストされたキーと値のペアを含むプロパティ ファイルを Spring にロードさせるにはどうすればよいでしょうか。

たとえば、次の car.properties ファイルがあるとします。

Chevy=Corvette:String,1234567890:long,sportsCar:String
Honda=Odyssey:String,2345678910:long,minivan:String
Ford=F350:String,4567891011:long,truck:String

ここで、プロパティ ファイルの各行には、make であるキーがあり、その後に 3 つのネストされたキーと値のペアが続きます。つまり、モデル用に 1 つ、VIN 用に 1 つ、車両タイプ用に 1 つです。

<make>=<model>:<dataType>,<vin>:<dataType>,<vehicleType>:<dataType>

将来の車両が後で追加されるため、この構造を使用しています。また、基礎となる Java コードを変更したくありません。そして、これらの車両のプロパティを使用して、テスト用の車両に関するランダム データを生成するとします。

Spring を使用して、プロパティ ファイルの各行を車両値のコレクションとしてロードし、arraylist に格納するにはどうすればよいですか? これらの各車両が「すべての車両」配列リスト内の配列リストになる2D配列リストがあると思います。次に、ビークル配列リストの 1 つをランダムに選択して、ダミーのビークル データを生成します。

とにかく、私は正しい軌道に乗っていると思いますが、Spring を使用してネストされたキーと値のペアをロードする方法がわかりません。助言がありますか?

私のために働く更新されたcontext.xml:

ところで、ここに私が使用している context.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:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/util     http://www.springframework.org/schema/util/spring-util-2.0.xsd">

    <!-- creates a java.util.Properties instance with values loaded from the supplied     location -->
<util:properties id="carProperties" location="classpath:/car.properties"/>

    <bean class="com.data.rcgen.generator.CarLoader">
        <property name="sourceProperties" ref="carProperties" />
    </bean>

</beans>
4

1 に答える 1

1

春があなたのためにこれを行う方法はありません。解析を自分で実装する必要があります。ただし、Spring はいくつかの便利なユーティリティ クラスを提供できます。

  • util:propertiesconfig要素を介してプロパティファイルをロードできます
  • BeanWrapperImplカスタム Bean のプロパティを設定するために使用できます。

(タイプミスを含む可能性があります):

<util:properties id="carProperties" location="classpath:car.properties"/>

<bean class="my.package.CarLoader">
    <property name="sourceProperties" ref="carProperties" />
</bean>

public class Car {
    private String name;
    private String category;
    // ... Getters and setters
}

public class CarLoader {

    private Properties sourceProperties;

    public List<Car> getCars() {
        List<Car> cars = new ArrayList<Car>();
        for (Object key : sourceProperties.keySet()) {
            // Do the parsing - naive approach
            String[] values = sourceProperties.getProperty((String) key).split(",");
            // Create bean wrapper and set the parsed properties... will handle data convesions with 
            // default property editors or can use custom ConversionService via BeanWrapper#setConversionService
            BeanWrapper wrappedCar = PropertyAccessorFactory.forBeanPropertyAccess(new Car());
            wrappedCar.setPropertyValue("name", values[0].split(":")[0]); // Getting rid of the `:type`
            wrappedCar.setPropertyValue("category", values[2].split(":")[0]); // Getting rid of the `:type`
            // Phase 3 - prosper
            cars.add((Car) wrappedCar.getWrappedInstance());
        }
        return cars;
    }

    public void setSourceProperties(Properties properties) {
        this.sourceProperties = properties;
    }

}

mainメソッドからアプリケーションコンテキストをブートストラップする基本的な例を更新します。

public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
        CarLoader carLoader = context.getBean(CarLoader.class);
        for (Car car : carLoader.getCars()) {
            System.out.println("CAR - " + car.getName());
        }
    }

}
于 2013-10-04T17:20:12.247 に答える