Why can I not make an instance of a local Java class in side of a Java WebMethods Services?

StackOverflow https://stackoverflow.com/questions/21466139

  •  05-10-2022
  •  | 
  •  

Question

I need to be able to create an instance of the following class in my web Services Method and for some reason there is an error.

Question: Why would I not be able to declare and instance of my class in my Java WEBServices?

    **GetTheFileListClass FindArrayListOfFiles = new GetTheFileListClass(fileName);**

Error:

The source was saved, but was not compiled due to the following errors:
C:\SoftwareAG\IntegrationServer\packages\DssAccessBackup\code\source\DssAccessBackup\services\flow.java:48: non-static variable this cannot be referenced from a static context

        GetTheFileListClass FindArrayListOfFiles = new GetTheFileListClass(fileName);
  1 error

Code:

public final class ReturnListOfValidFileNames_SVC

{

    /** 
     * The primary method for the Java service
     *
     * @param pipeline
     *            The IData pipeline
     * @throws ServiceException
     */
    public static final void ReturnListOfValidFileNames(IData pipeline)
            throws ServiceException {
        IDataCursor pipelineCursor = pipeline.getCursor();
        String fileName  = IDataUtil.getString(pipelineCursor,"FileName");
        ArrayList<String> listOfFileName = new ArrayList<String>(); 

        //This will get the file list and set it to the local parameter for the Service

        **GetTheFileListClass FindArrayListOfFiles = new GetTheFileListClass(fileName);**

        listOfFileName = FindArrayListOfFiles.getMyFileList();

        IDataUtil.put( pipelineCursor,"ListOfFileNames",listOfFileName.toArray());
        pipelineCursor.destroy();   
    }

    // --- <<IS-BEGIN-SHARED-SOURCE-AREA>> ---

    public class GetTheFileListClass {
        String fileName = new String();
        ArrayList<String> MyFileList = new ArrayList<String>();
        String InputFile = new String();

        GetTheFileListClass(String workFile){
            setInputFile(workFile);
        }

        public void setMyFileList(ArrayList<String> myList, String newFileValueToAdd) {
            myList.add(newFileValueToAdd);
        }

        public ArrayList<String> getMyFileList() {
            return MyFileList;
        }

        public void setInputFile(String wFile) {
            fileName = wFile;
        }

        public String getInputFile(){
            return fileName;
        }

        private String returnFileName(String a) {
           String matchEqualSign = "=";
           String returnFile = new String();
           int index = 0;

           index = a.indexOf(matchEqualSign,index);
           index++;

           while (a.charAt(index) != ' ' && a.charAt(index) != -1) {
               returnFile += a.charAt(index);
               //System.out.println(returnFile);
               index++;
           }

           return returnFile;
        }

        private void locatedFileName(String s, String FoundFile, ArrayList<String> myFileListParm) {
            final String REGEX = ("(?i)\\./\\s+ADD\\s+NAME\\s*=");
            Pattern validStringPattern = Pattern.compile(REGEX);
            Matcher validRegMatch = validStringPattern.matcher(s);
            boolean wasValidRegMatched = validRegMatch.find();

            if (wasValidRegMatched) {
                FoundFile = returnFileName(s); //OUTPUT variable should go here
                setMyFileList(myFileListParm,FoundFile);
            } 
        }

        //This is the methods that needs to be called from the main method
        private void testReadTextFile() throws IOException {
                BufferedReader reader = new BufferedReader(new FileReader(fileName));
                String FileLine = null;
                while ((FileLine = reader.readLine()) != null) {
                    locatedFileName(FileLine,fileName,MyFileList); //test to see if the "./ Add name=" is found in any of the strings
                }
        }

        private void printArrayFileList(ArrayList<String> myList) {
            for (String myIndexFileListVariable : myList) {
                System.out.println("File Name: " + myIndexFileListVariable);
            }
        }
    }

    // --- <<IS-END-SHARED-SOURCE-AREA>> ---
}
Was it helpful?

Solution

your inner class is not static, try

public static class GetTheFileListClass { ....

OTHER TIPS

The rules of scope still apply, even though GetTheFileListClass is (a) a class and is (b) public. Because it is declared inside of ReturnListOfValidFileNames_SVC, that is its enclosing class, so any non-static reference to it must follow the rules of scope.

So you have two options (I'm using main to simulate your static method):

Declare the inner class static:

public final class Outer {

  public static void main(String[] args) {
    Inner inner = new Inner ();
    inner.doIt();
  }

  public static class Inner {
    public void doIt() {
      System.out.println("Do it");
    }
  }

}

OR

Within your static method, create an instance of the enclosing class and use the new operator on it like this

public final class Outer {

  public static void main(String[] args) {
    Outer outer = new Outer();// Now we have an enclosing instance!
    Inner inner = outer.new Inner ();
    inner.doIt();
  }

  public class Inner {
    public void doIt() {
      System.out.println("Do it");
    }
  }

}

Have fun!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top