2014-01-30 4 views
1

웹 서비스 메서드에서 다음 클래스의 인스턴스를 만들 수 있어야하며 어떤 이유로 오류가 있습니다.Java WebMethods 서비스의 측면에서 로컬 Java 클래스의 인스턴스를 만들 수없는 이유는 무엇입니까?

질문 : Java WEBServices에서 내 클래스의 인스턴스를 선언하고 인스턴스를 만들 수없는 이유는 무엇입니까?

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

오류 :

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 

코드 : 범위가 여전히 적용의

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>> --- 
} 

답변

3

내면의 클래스는 정적 아니라, 심지어 GetTheFileListClass 불구하고,

public static class GetTheFileListClass { .... 
+0

감사합니다. 그게 효과가 있었어. 따라서 모든 클래스는 정적이어야합니다. 나는 WEBMethods가 자바에서 할 수있는 것처럼 클래스를 메인 클래스 외부에 배치 할 수 없다는 것을 알았다. 이것이 WEBMethods의 첫 아침입니다. 그래서 그것은 학습 경험입니다. 이 주제에 대한 좋은 책이 있습니까? –

3

규칙 시도 (a) 클래스이고 (b) public이다. 그것은 ReturnListOfValidFileNames_SVC 안에 선언되어 있기 때문에 그 클래스를 둘러싼 것이므로 비 정적 참조가 범위 규칙을 따라야합니다.

정적 내부 클래스 선언 :

그래서 당신이 (내가 정적 방법을 시뮬레이션하기 위해 주요 사용하고 있습니다) 두 가지 옵션이 정적 방법 내에서

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"); 
    } 
    } 

} 

또는

을 만들 둘러싸는 클래스의 인스턴스이며 이와 같이 new 연산자를 사용하십시오.

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"); 
    } 
    } 

} 

재미있게 보내세요!