如何加载我的属性文件?

时间:2012-03-28 12:37:36

标签: java java-ee properties websphere messages

我正在使用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 个答案:

答案 0 :(得分:2)

您应该将属性文件作为类路径资源加载,而不是从文件系统加载文件。阅读本文,了解如何执行此操作Smartly load your properties

答案 1 :(得分:1)

而不是执行以下操作,

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

这样做:

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

答案 2 :(得分:1)

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

返回null

这就是NPE投入读者的原因。

问题是为什么输入流为空?因为fileName包含错误的值。所以,调试它。在行中切换断点

String fileName = getPropertiesPath()+dictionaryFileName;

并看看它返回了什么。

答案 3 :(得分:1)

您看到的异常是从Properties.load()深度抛出的空指针异常。原因是传递的参数(fileInput)为空。很可能是因为fileName中指定的路径不正确。

尝试使用/预先添加路径。

另外,请确保该文件存在。 getResourceAsStream()方法将在与该类关联的资源中查找该文件(例如,如果您从一个程序运行程序,则必须是.jar的一部分。)