Как загрузить мой файл свойств? - PullRequest
0 голосов
/ 28 марта 2012

Я использую websphere и Java EE и получаю это сообщение об ошибке:

Exception reading propertiesfile in init java.lang.NullPointerException
java.lang.NullPointerException
    at java.io.Reader.<init>(Reader.java(Inlined Compiled Code))
    at java.io.InputStreamReader.<init>(InputStreamReader.java(Inlined Compiled Code))
    at java.util.Properties.load(Properties.java(Compiled Code))
    at se.prv.register.admin.util.MessageHandler.loadDictionary(MessageHandler.java:90)
    at se.prv.register.admin.util.MessageHandler.<clinit>(MessageHandler.java:15)

Это мой код

package se.prv.pandora.arendeprocess.util;

import java.io.InputStream;
import java.util.Properties;

import org.apache.log4j.Logger;

public class MessageHandler extends AbstractTextHandler{
    private static Properties dictionary;
    private final static String dictionaryFileName="messages.properties";
    private final static String className="se.prv.pandora.arendeprocess.util.MessageHandler";
    private static Logger logger = Logger.getLogger(MessageHandler.class);

    static {
        loadDictionary();
    }

    public static void main(String[] args) {
        String str = getParameterizedMessageTest("TEST",new String[]{"PETER","GÖRAN"});
        System.out.println(str);
    }
    public static String getMessage(String key){
        return getMessage(key,true);
    }
    public static String getMessage(String key,boolean useReference){
        logger.debug("!!!! getMessage "+ key);
        if (key==null || key.length()==0){
            throw new RuntimeException("GetMessage without key");
        }
        if (dictionary==null){
            loadDictionary();
        }
        if (useReference){
            return getFullMessage(getMessage(dictionary,key));
        }
        else {
            //String str = getMessage(dictionary,key);
            //logger.debug(str);
            String str2 = getCoreMessage(getMessage(dictionary,key));
            //logger.debug(str2);
            return str2;
        }
    }
    public static String getFirstPartOfMessage(String key){
        if (key==null || key.length()==0){
            throw new RuntimeException("GetMessage without key");
        }
        if (dictionary==null){
            loadDictionary();
        }
        String msg = getMessage(dictionary,key);
        int pos = msg.indexOf('$');
        if (pos==-1){
            return msg;
        }
        else {
            return msg.substring(0,pos);
        }
    }
    public static String getLastPartOfMessage(String key){
        if (key==null || key.length()==0){
            throw new RuntimeException("GetMessage without key");
        }
        if (dictionary==null){
            loadDictionary();
        }
        String msg = getMessage(dictionary,key);
        int pos = msg.lastIndexOf('$');
        if (pos==-1){
            return msg;
        }
        else {
            return msg.substring(pos+1);
        }
    }
    public static String getParameterizedMessage(String key, String [] params){
        if (dictionary==null){
            loadDictionary();
        }
        return getParameterizedMessage(dictionary,key,params);
    }
    private static void loadDictionary(){       
        String fileName = getPropertiesPath()+dictionaryFileName;
        //String fileName = "se/prv/register/admin/dao/sql-map-config.xml";

        try {
            dictionary=new Properties();
            //InputStream fileInput =  Class.forName("se.prv.register.admin.util.MessageHandler").getClassLoader().getResourceAsStream(fileName);
            InputStream fileInput =  Class.forName(className).getClassLoader().getResourceAsStream(fileName);
            dictionary.load(fileInput);
            fileInput.close();
        }
        catch(Exception e) {
            System.err.println("Exception reading propertiesfile in init "+e);
            e.printStackTrace();
            dictionary=null;
        }
    }
    private static String getCoreMessage(String str){
        StringBuffer buff = new StringBuffer();
        boolean doCopy=true;
        for (int i=0;i<str.length();i++){
            if (str.charAt(i)=='$'){
                doCopy=!doCopy;
                continue;
            }
            if (doCopy){
                buff.append(str.charAt(i));
            }
        }
        return buff.toString();
    }
    private static String getFullMessage(String str){
        int pos = str.indexOf('$');
        if (pos==-1){
            return str;
        }
        StringBuffer buff = new StringBuffer(str);

        int originalLength = buff.length();
        for (int i=pos+1;i<buff.length();i++){
            if (buff.charAt(i)== '$'){
                String key = buff.substring(pos+1,i).trim();
                String msg = getMessage(dictionary,key);
                buff.replace(pos,i+1,msg);
                if (buff.length()!=originalLength){
                    i += (buff.length()-originalLength);
                    originalLength=buff.length();
                }
                pos = buff.indexOf("$",i+1);
                if (pos==-1){
                    break;
                }
                else {
                    i = pos+1;
                }
            }
        }
        return buff.toString();
    }
//  private static void loadDictionary(){       
//      loadDictionary(dictionary,dictionaryFileName,className);
//  }
}

package se.prv.register.admin.util;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;

import org.apache.log4j.Logger;

import se.prv.framework.general.PRVWebSphere;
import se.prv.framework.util.Strings;

public abstract class AbstractTextHandler {

        private static final String propertiesPath="//se//prv//register//properties//";
        protected static Logger logger = Logger.getLogger(AbstractTextHandler.class);

//      static {
//          loadProperties();
//      }
        protected static String getPropertiesPath(){
            return propertiesPath;
        }
        protected static String getMessage(Properties dictionary,String key){
            if (dictionary==null){
                return "ERROR";
            }
            String msg = dictionary.getProperty(key);
            //System.out.println("KEY="+key);
            if (msg==null){
                return "?!Meddelande " +key + " saknas!?";
            }
            return msg;
        }
        protected static String getParameterizedMessage(Properties dictionary,String key,String []params){
            if (dictionary==null){
                return "ERROR";
            }
            String msg = dictionary.getProperty(key);
            if (msg==null){
                return "?!Meddelande " +key + " saknas!?";
            }
            if (params==null){
                return msg;
            }
            StringBuffer buff = new StringBuffer(msg);
            for (int i=0;i<params.length;i++){
                String placeHolder = "<<"+(i+1)+">>";
                if (buff.indexOf(placeHolder)!=-1){
                    replace(buff,placeHolder,params[i]);
                }
                else {
                    remove(buff,placeHolder);
                }
            }
            return buff.toString();
        }
        public static String getParameterizedMessageTest(String key,String []params){
            String msg = "HEJ <<1>>!HUR MÅR DU? HEJ DÅ FRÅN <<2>>";
            if (msg==null){
                return "?!Meddelande saknas!?";
            }
            if (params==null){
                return msg;
            }
            StringBuffer buff = new StringBuffer(msg);
            for (int i=0;i<params.length;i++){
                String placeHolder = "<<"+(i+1)+">>";
                if (buff.indexOf(placeHolder)!=-1){
                    replace(buff,placeHolder,params[i]);
                }
                else {
                    remove(buff,placeHolder);
                }
            }
            return buff.toString();
        }
        private static void replace(StringBuffer buff,String placeHolder,String param){
            int pos = buff.indexOf(placeHolder);
            if (pos==-1){
                return;
            }
            buff.replace(pos,pos+placeHolder.length(),param);
        }
        private static void remove(StringBuffer buff,String placeHolder){
            int pos = buff.indexOf(placeHolder);
            if (pos==-1){
                return;
            }
            buff.replace(pos,pos+placeHolder.length(),placeHolder);
        }
        protected static void loadDictionary(Properties dictionary,String fileName,String className){       
            //String fileName = "se/prv/register/admin/dao/sql-map-config.xml";

            try {
                dictionary=new Properties();
                InputStream fileInput =  Class.forName("se.prv.register.admin.util.AbstractTextHandler").getClassLoader().getResourceAsStream(fileName);
                dictionary.load(fileInput);
                fileInput.close();
            }
            catch(Exception e) {
                logger.error("Exception reading propertiesfile in init "+e);
                e.printStackTrace();
                dictionary=null;
            }
        }
    }

Я поместил файл сообщений messages.properties в тот же каталог, что и файл log4j.properties, так что я думаю, что его нужно забрать. Что я делаю не так?

Спасибо

Ответы [ 4 ]

2 голосов
/ 28 марта 2012

Файл свойств следует загружать как ресурсы пути к классам, а не как файл из файловой системы. Прочтите эту статью о том, как это сделать Умно загрузить ваши свойства .

1 голос
/ 28 марта 2012

Исключением, которое вы видите, является исключение нулевого указателя, выбрасываемое из глубины Properties.load(). Причина в том, что переданный параметр (fileInput) является нулевым. Скорее всего, потому что путь, указанный в fileName, неверен.

Попробуйте добавить путь к /.

Также убедитесь, что файл существует. Метод getResourceAsStream() будет искать файл в ресурсах, связанных с классом (например, он должен быть частью .jar, если вы запускаете программу из него).

1 голос
/ 28 марта 2012

Линия InputStream fileInput = Class.forName(className).getClassLoader().getResourceAsStream(fileName);

возвращает null.

Это причина того, что NPE брошен в читателя.

Вопрос в том, почему входной поток равен нулю? Потому что fileName содержит неправильное значение. Итак, отладим это. Переключить точку останова на линии

String fileName = getPropertiesPath()+dictionaryFileName;

и посмотрите, что он вернет.

1 голос
/ 28 марта 2012

Вместо того, чтобы делать ниже,

InputStream fileInput = Class.forName(className).getClassLoader().getResourceAsStream(fileName);

сделать это:

InputStream fileInput = MessageHandler.class.getClassLoader().getResourceAsStream(fileName);
...