2011-01-19 21 views
0

私はドメインクラスを持っていて、プロパティファイルから値を読み取る必要があります(autowiring messageSourceはここでは機能しません)。私は春を使用しています 、 を休止し、ここではサンプルです:JavaBean(ドメインクラス)のプロパティファイルから値を読み取る方法は?

すべての横に
package com.myapp.domain; 

import java.io.Serializable; 

import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 


@SuppressWarnings("serial") 
@Entity 
@Table(name = "domain") 
public class MyDomain implements Serializable { 

    private long entityId; 
    private String domain="some_hardcoded_value" // need to read it from a property file; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", unique = true, nullable = false) 
    @Basic(fetch = FetchType.EAGER) 
    public long getEntityId() { 
     return entityId; 
    } 

    public void setEntityId(long entityId) { 
     this.entityId = entityId; 
    } 

    public void setDomain(String domain) { 
     this.domain = domain; 
    } 

    @Column(name = "domain") 
    public String getDomain() { 
     return domain; 
    } 

} 
+3

私は、なぜ自動配線が動作しないでしょう、あなたの質問を理解していませんでした。それはそのエンティティクラス(したがって、Spring AppContextの範囲外)なのですか?プロパティファイルから読み込むことはとても特別です。私は少し失われていると思います。 –

+0

私はmessageSourceを試しましたが、いつも例外があります。org.hibernate.InstantiationException:テストobjectcom.myapp.domain.MyDomainと(ContextLoader。)をインスタンス化できませんでした。java:220) - コンテキストの初期化に失敗し、java.lang.NullPointerExceptionが発生する \t at com.myapp.domain.MyDomain。 –

答えて

3

この記事をお読みください私はまだ質問を理解していませんしかし、私はあなたがBeanプロパティをプロパティファイル他の回答が(私は以下の追加の方法を紹介します)の.propertiesファイルからPropertiesオブジェクトを取得する方法を示している

、私は春のBeanWrapperインタフェースを使用して、それからプロパティを配線する方法を紹介します:

public static void wireBeanFromProperties(Object bean, Properties props){ 

    BeanWrapper wrapper = new BeanWrapperImpl(bean); 
    for(Entry<Object, Object> entry:props.entrySet()){ 
     String propertyName = entry.getKey().toString(); 
     if(wrapper.isWritableProperty(propertyName)){ 
      wrapper.setPropertyValue(propertyName, entry.getValue()); 
     } 
    } 

} 

それとも、あなたは確かに知っている場合のプロパティファイルからのすべてのプロパティは、クラスのこのBeanのプロパティにマップすることができ:

public static void wireBeanFromProperties(final Object bean, 
    final Properties props){ 
    final BeanWrapper wrapper = new BeanWrapperImpl(bean); 
    // will throw an exception if the Properties object 
    // contains any unknown keys 
    wrapper.setPropertyValues(props); 
} 

参考:5.4. Bean manipulation and the BeanWrapper


実際には、クラスパスからリソースをロードする春の具体的な方法は、素敵な部分は、あなたがclasspath:構文を使用してXMLから簡単に両方いるInputStreamsとリソースを配線できることですthe Resource mechanism

InputStream str = new ClassPathResource("classpath:some.properties") 
         .getInputStream(); 

使用します。

Javaコード

private InputStream stream; 
private Resource resource; 
public void setStream(InputStream stream){ 
    this.stream = stream; 
} 
public void setResource(Resource resource){ 
    this.resource = resource; 
} 

プロパティ配線:

<bean class="MyClass"> 
    <property name="stream" value="classpath:file1.properties" /> 
    <property name="resource" value="classpath:file2.properties" /> 
</bean> 

あなただけのstatic finalフィールドを初期化したい場合は、ここでそれを行う方法は次のとおりです。

private static final String DOMAIN; 
static{ 
    InputStream inputStream=null; 
    try{ 
     inputStream = new ClassPathResource("classpath:some.properties") 
          .getInputStream(); 
     Properties props = new Properties(); 
     props.load(inputStream); 
     String key = "your.property"; 
     if(!props.containsKey(key)) 
      throw new IllegalStateException("Property not found"); 
     DOMAIN= props.getProperty(key); 
    } catch(IOException e){ 
     throw new IllegalStateException(e); 
    }finally{ 
     // apache commons/IO 
     IOUtils.closeQuietly(inputStream); 
    } 
} 
+0

JavaBeanクラスでやりたいことは、プロパティファイルから次のプロパティ値を読み込むことです。 。private String domain = "some_hardcoded_value" //プロパティファイルから読み込む必要があります。 –

+0

@ sword101よろしくお願いします。 –

+0

これは定数ではなく、変数ですがデフォルト値を持っていますので、デフォルト値を初期化したいので、最後を削除する必要がありますか? –

0

、あなたは常に行うことができ、

Thread.currentThread.getContextClassLoader().getResourceAsStream("some.properties") 

は、しかし、私はから、まだあなたがあなたのEntityで読みたいものを好奇心プロパティファイルインターネットで検索した後、私は

<!--Bean to load properties file --> 

<bean id="placeholderConfig" 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
<property name="location" value="classpath:config.properties"> 
<!--reads config.properties file--> 

下回ったアンサリさんコード

Properties p = new Properties(); 
p.load (Thread.currentThread().getContextClassLoader(). 
     getResourceAsStream("some.properties")); 

p.list(System.out); // or p.get("name") --> name=value. 

に追加

+0

ハードコードされたプロパティのデフォルト値を読みたい。この方法とMessageSourceの違いは何ですか?このように問題があるのでしょうか? –

+0

@ sword101:申し訳ありませんが、私は 'MessageSource'が何であるか分かりません。私はそのようにするのはかなり大丈夫だと思います。 –

+0

しかし、上記のコードは、文字列値ではなく、入力ストリームを返す –

関連する問題