2012-01-25 9 views
6

Sử dụng Spring, tôi muốn đọc một biến bên trong ngữ cảnh của Webspehere.Spring Jndi Context và PropertyPlaceholderConfigurer

Read a Environment Variable in Java with Websphere

Để xác định các dữ liệu .... bên trong web.xml

<env-entry> 
    <env-entry-name>varName</env-entry-name> 
    <env-entry-value>56</env-entry-value> 
    <env-entry-type>java.lang.String</env-entry-type> 
</env-entry> 

Để xem với java

Context envEntryContext = (Context) new InitialContext().lookup("java:comp/env"); 
String mydata = (String)envEntryContext.lookup(“varName”); 

Nhưng tôi muốn lấy dữ liệu trong common.xml của tôi như

<bean id="propertyPlaceholderConfigurer" 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>/WEB-INF/context/servweb.properties</value> 
     </list> 
    </property> 
    <property name="ignoreUnresolvablePlaceholders"> 
     <value>true</value> 
    </property> 
</bean> 

có thể với một cái gì đó như thế

<constructor-arg> 
    <jee:jndi-lookup jndi-name="java:comp/env" default-value="data" /> 
    </constructor-arg> 

nhưng với bối cảnh cho làm như vậy mà

Context envEntryContext = (Context) new InitialContext().lookup("java:comp/env"); 
String mydata = (String)envEntryContext.lookup(“varName”); 

có lẽ một cái gì đó như thế:

<constructor-arg> 
    <jee:jndi-lookup jndi-name="java:comp/env"> 
     <jee:environment> 
      varName=default 
    </jee:environment> 
    </jee:jndi-lookup> 

Bất kỳ ai biết một cách chính xác?

Cảm ơn trước

Trả lời

7

Bạn có thể tạo PropertyPlaceholderConfigurer của riêng bạn

public class JndiPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { 

    private String jndiPrefix = "java:comp/env/"; 
    private JndiTemplate jndiTemplate = new JndiTemplate(); 

    @Override 
    protected String resolvePlaceholder(String placeholder, Properties props) { 
     String value = null; 
     value = resolveJndiPlaceholder(placeholder); 
     if (value == null) { 
      value = super.resolvePlaceholder(placeholder, props); 
     } 
     return value; 
    } 

    private String resolveJndiPlaceholder(String placeholder) { 
     try { 
      String value = (String)jndiTemplate.lookup(jndiPrefix + placeholder, String.class); 
      return value; 
     } catch (NamingException e) { 
      // ignore 
     } 
     return null; 
    } 

    public void setJndiPrefix(String jndiPrefix) { 
     this.jndiPrefix = jndiPrefix; 
    } 

    public void setJndiTemplate(JndiTemplate jndiTemplate) { 
     this.jndiTemplate = jndiTemplate; 
    } 
} 

và sau đó sử dụng nó trong bạn applicationContext.xml

<bean id="propertyPlaceholderConfigurer" 
     class="mypkg.helper.JndiPropertyPlaceholderConfigurer"> 
    <property name="properties"> 
     <props> 
      <prop key="varName">default</prop> 
     </props> 
    </property> 
</bean> 

hoặc để xác định các giá trị mặc định trong một thuộc tính tập tin

<bean id="propertyPlaceholderConfigurer" 
     class="mypkg.helper.JndiPropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:/defaults.properties"/> 
</bean> 
+0

trình, không có vấn đề .. Thank you very much – Kaltresian

0
<bean id="propertyConfigurer" 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
<property name="location"> 
<value>classpath:resources/my-jndi.properties</value>  
</property> 
</bean> 

Trong my-jndi.properties: jndi-qconnfactory = jms/QConnFactory

<jee:jndi-lookup id="connectionFactory" jndi-name="${jndi-qconnfactory}"/> 
1

tôi đang làm điều tương tự trong webapplication của tôi, nhưng không có khả năng đọc từ InitialContext

ApplicationContext. xml có

<bean 
    class="com.test.webappl.JndiPropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="location" value="file:c:\my.properties"/> 
</bean> 

my.properties có

default_mask=9999 

cố gắng đọc

Context context = new InitialContext(); 
String resource = context.lookup("java:comp/env/default_mask"); 

nhưng của bối cảnh ràng buộc chỉ có env-entry từ web.xml, không phải từ tệp thuộc tính

1

Nếu bạn chỉ muốn nhận giá trị của biến được xác định trong ngữ cảnh vùng chứa và sử dụng nó làm Chuỗi mà không tạo đối tượng giữ chỗ, bạn có thể thực hiện các thao tác sau trong Tomcat nhưng nhiều khả năng hoạt động tương tự trong container/máy chủ JEE khác như WebSphere):

Xác định các biến môi trường trong Tomcat của context.xml (hoặc sử dụng cú pháp máy chủ của riêng bạn):

<Environment type="java.lang.String" name="myString" value="hello"/> 

trong XML mùa xuân tệp ngữ cảnh:

Thêm namespace jee đến phần tử gốc:

xmlns:jee="http://www.springframework.org/schema/jee" 

và trong các xsi:schemaLocation:

http://www.springframework.org/schema/jee  http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 

Bây giờ bạn có thể dễ dàng tìm kiếm một giá trị (lưu ý rằng bạn không cần phải xác định java:/comp/env thứ, mùa xuân nào đó cho bạn):

<jee:jndi-lookup id="myStringValue" 
        jndi-name="myStringValue" 
        expected-type="java.lang.String" /> 

Sau đó, bạn có thể sử dụng nó, ví dụ vượt qua nó để các nhà xây dựng của một bean như một tham khảo ence:

<bean id="observationFileManager" class="my.service.Bean"> 
    <constructor-arg name="myString" ref="myStringValue" /> 
</bean> 

Đậu sẽ nhận được "hello" làm construcotr arg.

EDIT:

Nếu bạn chạy bối cảnh mùa xuân của bạn bên ngoài container (Tomcat, Websphere ...) để thử nghiệm hội nhập, tra cứu sẽ không hoạt động. Vì vậy, nếu bạn có một bối cảnh kiểm tra đặc biệt, chỉ cần thêm String định nghĩa sau đó sẽ ghi đè lên jee:lookup và thiết lập các giá trị mà bạn muốn sử dụng để thử nghiệm:

<!-- This overrides the jndi jee:lookup used in the real context --> 
<bean id="mediaFilesBaseDirPath" class="java.lang.String" > 
    <constructor-arg value="Z:" /> 
</bean>