سؤال

لدي ملف خصائص للتوطين:

foo=Bar
title=Widget Application

هذا مرتبط بصفته أ resource-bundle في الوجوه المتوحشة:

<resource-bundle>
    <base-name>com.example.messages.messages</base-name>
    <var>msgs</var>
</resource-bundle>

يمكنني الوصول إلى هذا على ما يرام في عرض الوجه باستخدام EL:

<title>#{msgs.title}</title>

ومع ذلك ، إذا كانت هناك أشياء مثل sqlexpections ، فأنا بحاجة إلى أن أكون قادرًا على كتابة رسائل من الفول المدارة. كل هذا يعمل أيضًا:

FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "There was an error saving this widget.", null);
FacesContext.getCurrentInstance().addMessage(null, message);

فيما يلي المشكلة: أريد أن تأتي هذه الرسائل من ملف الخصائص بحيث يمكن تغييرها أيضًا بناءً على اللغة. هل هناك طريقة سهلة للوصول إلى ملف الخصائص باستخدام الحقن؟

هل كانت مفيدة؟

المحلول

سألت سؤالًا ذا صلة تمامًا على ذلك:كيفية حقن فئة غير قابلة للتخليص (مثل java.util.resourceBundle) مع اللحام

وداخل منتدى التماس:http://seamframework.org/community/howtoCreateanInjectableresourceBundleWithWeld

لتلخيص: أدركت أن ResourceBundle حقن مع 3 منتجين. تحتاج أولاً إلى FaceSconTextProducer. أخذت واحد من مصادر ألفا Seam 3.

public class FacesContextProducer {
   @Produces @RequestScoped
   public FacesContext getFacesContext() {
      FacesContext ctx = FacesContext.getCurrentInstance();
      if (ctx == null)
         throw new ContextNotActiveException("FacesContext is not active");
      return ctx;
   }
}

ثم تحتاج إلى عامل توقيت محلي ، والذي يستخدم FacesContextProducer. لقد أخذتها أيضًا من Seam 3 Alpha.

public class FacesLocaleResolver {
   @Inject
   FacesContext facesContext;

   public boolean isActive() {
      return (facesContext != null) && (facesContext.getCurrentPhaseId() != null);
   }

   @Produces @Faces
   public Locale getLocale() {
      if (facesContext.getViewRoot() != null) 
         return facesContext.getViewRoot().getLocale();
      else
         return facesContext.getApplication().getViewHandler().calculateLocale(facesContext);
   }
}

الآن لديك كل شيء لإنشاء ResourceBundleProducer ، والتي يمكن أن تبدو هكذا:

public class ResourceBundleProducer {
  @Inject       
  public Locale locale;

  @Inject       
  public FacesContext facesContext;

  @Produces
  public ResourceBundle getResourceBundle() {
   return ResourceBundle.getBundle("/messages", facesContext.getViewRoot().getLocale() );
  }
}

الآن يمكنك الحصول على @ResourceBundle في حبوبك. انتبه إلى أنه يجب حقنه في سمة عابرة ، وإلا ستحصل على استثناء يشكو من أن ResourceBundle غير قابل للتسلسل.

@Named
public class MyBean {
  @Inject
  private transient ResourceBundle bundle;

  public void testMethod() {
    bundle.getString("SPECIFIC_BUNDLE_KEY");
  }
}

نصائح أخرى

من الأسهل استخدام وحدة الرسائل على سبيل المثال myfaces codi!

يمكنك القيام بذلك مع JSF وحده.

ابدأ بتحديد خاصية مُدارة على Backing Bean. في تكوين JSF ، يمكنك تعيين قيمة الخاصية المدارة على تعبير EL الذي يشير إلى حزمة الموارد الخاصة بك.

لقد قمت بشيء مثل ما يلي باستخدام Tomcat 6. التحذير الوحيد هو أنه لا يمكنك الوصول إلى هذه القيمة من مُنشئ Backing Bean ، نظرًا لأن JSF لن يقوم بتهيئته بعد. يستخدم @PostConstruct على طريقة التهيئة إذا كانت القيمة مطلوبة في وقت مبكر في دورة حياة الفول.

<managed-bean>
  ...
  <managed-property>
    <property-name>messages</property-name>
    <property-class>java.util.ResourceBundle</property-class>
    <value>#{msgs}</value>
  </managed-property>
  ...
</managed-bean>

<application>
  ...
  <resource-bundle>
    <base-name>com.example.messages.messages</base-name>
    <var>msgs</var>
  </resource-bundle>
  ...
</application>

هذا له ميزة لجعل أساليب Backing Bean أقل اعتمادًا على تقنية العرض التقديمي ، لذلك يجب أن يكون الاختبار أسهل. كما أنه يفصل رمزك من تفاصيل مثل الاسم المعطى للحزمة.

بعض الاختبارات باستخدام Mojarra 2.0.4-B09 لا تظهر تناقضًا صغيرًا عندما يغير المستخدم منطقة منتصف الموقع. تستخدم تعبيرات EL في الصفحة المكان الجديد ، لكن فول الدعم لا يعطى مرجع ResourceBundle الجديد. لجعلها ثابتة يمكنك استخدام قيمة خاصية الفول في تعبيرات EL ، مثل استخدام #{backingBean.messages.greeting} بدلاً من #{msgs.greeting}. بعد ذلك ، ستستخدم Page El و Backing Bean دائمًا المكان الذي كان نشطًا عندما بدأت الجلسة. إذا المستخدمين كان لتبديل الأماكن في منتصف الجلسة والحصول على الرسائل الجديدة ، يمكنك محاولة عمل حبة سكنية على الطلب ومنحها إشارات إلى كل من حزمة Bean and Resource Bundle.

إليك مثال على كيفية القيام بذلك:http://www.laliluna.de/articles/javaserver-faces-message-resource-bundle-tutorial.html

تريد إلقاء نظرة على ResourceBundle.getBundle() جزء.

تحياتي ، لارس

هذا سؤال قديم لكنني أضيف طريقة أخرى للقيام بذلك. كنت أبحث عن شيء آخر وركضت عبر هذا. تبدو الأساليب هنا جميعها معقدة لشيء لا يضربني مثل كل هذا صعب. اللعب مع بريق لأنه جميل إذا سألتني.

إعطاء ملف:

/com/full/package/path/to/messages/errormessages.properties

داخل الملف:

SOME_ERROR_STRING=Your App Just Cratered

أقوم بإنشاء طريقة "getBundle ()" لأنني أرغب في التقاط وقت التشغيل وإضافة رسالة ذات معنى لذلك سأفهم من أين تأتي. ليس صعبًا ويمكنك المساعدة إذا حصلت على نزوة للعب مع ملفات الخصائص لسبب ما ولا تقوم بتحديث كل شيء بشكل صحيح. أحيانًا أجعل هذا خاصًا لأنه في بعض الأحيان طريقة مساعد داخل الفصل (بالنسبة لي). هذا يحافظ على محاولة التقاط الفوضى من الكود ذي معنى.

يتيح لك استخدام المسار الكامل للملف وضعه في مكان آخر غير الموقع/الدليل الافتراضي إذا كان لديك أفكار أخرى في المؤسسة.

public/private ResourceBundle getMessageResourceBundle(){
    String messageBundle = "com.full.package.path.to.messages.errormessages";
    ResourceBundle bundle = null;
    try{
        bundle = ResourceBundle.getBundle(messageBundle);
    }catch(MissingResourceException ex){
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,
                    "Unable to find message bundle in XYZ Class", ex);
        throw ex;
    }

}

public void doSomethingWithBundle(){

    ResourceBundle bundle = getMessageResourceBundle();
    String someString = bundle.getString("SOME_ERROR_STRING");
    ...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top