2016-07-28 4 views
0

XML Restful Web Service에서 XML 파일을 응답으로 반환하고 있습니다. 이 XML 파일은 MAVEN 프로젝트 빌드의 main/resources 폴더 안에 eclipse로 저장됩니다. 이 서비스는 호출자의 특정 매개 변수를 받아들이고 이러한 매개 변수를 기반으로 XML 파일을 업데이트해야합니다. 이 프로젝트는 프로덕션 서버에서 WAR로 배포됩니다. 내 로컬 프로젝트에서 업데이트되는 xml 파일을 볼 수 있지만 프로덕션 서버에서는 그렇지 않습니다. 프로덕션 서버에서이 작업을 수행하려면 어떻게합니까? 다음은 스프링 REST 웹 서비스 | XML을 업데이트하고 응답으로 보내십시오.

는 다시

@Service("dialogService") 
public class DialogServiceXml implements DialogServiceXmlImpl { 

@SuppressWarnings({ "rawtypes", "unchecked" }) 
@Override 
public void updateXml(StringBuilder className, StringBuilder response) { 
    JAXBContext jaxbContext = null; 
    ClassLoader classLoader = getClass().getClassLoader(); 
    try { 
     jaxbContext = JAXBContext.newInstance("com.sau.watson.dialog.xsd.beans"); 

     Unmarshaller JAXBUnmarshaller = jaxbContext.createUnmarshaller(); 

     Marshaller JAXBMarshaller = jaxbContext.createMarshaller(); 
     JAXBMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     JAXBMarshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, "WatsonDialogDocument_1.0.xsd"); 

     File mor_dialog = new File(classLoader.getResource("mor_dialog.xml").getFile()); 
     //File mor_dialog = new File(classLoader.getResource("../../mor_dialog.xml").getFile()); 

     mor_dialog.setWritable(true); 
     //File mor_dialog_updated = new File(classLoader.getResource("mor_dialog_updated.xml").getFile()); 

     InputStream is = new FileInputStream(mor_dialog); 

     JAXBElement dialog = (JAXBElement) JAXBUnmarshaller.unmarshal(is); 
     is.close(); 

     //JAXBElement dialog = (JAXBElement) JAXBUnmarshaller.unmarshal(new FileInputStream("src/main/java/com/sau/watson/dialog/xml/mor_dialog.xml")); 

     DialogType dialogType = (DialogType) dialog.getValue(); 
     // System.out.println(dialogType.toString()); 
     // System.out.println(dialogType); 

     FlowType flowType = (FlowType) dialogType.getFlow(); 

     for (FolderNodeType folderNodeType : flowType.getFolder()) { 
      // System.out.println(folderNodeType.getLabel()); 

      if (folderNodeType.getLabel().equalsIgnoreCase("Library")) { 

       for (ChatflowNode libChatFlowNode : folderNodeType.getInputOrOutputOrDefault()) { 
        FolderNodeType libraryFolderNode = (FolderNodeType) libChatFlowNode; 
        // System.out.println(libraryFolderNode.getId()); 
        // System.out.println(libraryFolderNode.getLabel()); 

        StringBuilder classNameFromXml = new StringBuilder(); 

        for (ChatflowNode node : libraryFolderNode.getInputOrOutputOrDefault()) { 
         InputNodeType inputNodeType = (InputNodeType) node; 

         // Getting the class. Class name are encapsulated 
         // inside the <grammar> node 
         /** 
         * <grammar> <item>Salesperson_Great</item> 
         * <item>Great</item> </grammar> 
         */ 
         for (Object grammerTypeObj : inputNodeType.getActionOrScriptOrGrammar()) { 
          GrammarType grammarType = (GrammarType) grammerTypeObj; 

          // We are always getting the first item as it is 
          // assumed that there is only one class in each 
          // grammar node 
          classNameFromXml 
            .append(grammarType.getItemOrSourceOrParam().get(0).getValue().toString()); 
          System.out.println("Class Name is : " + className); 
         } 

         // We are always getting the first item as it is 
         // assumed that there is only one class in each 
         // grammar node 
         /* 
         * List<Object> grammarTypeObj = 
         * inputNodeType.getActionOrScriptOrGrammar(); 
         * GrammarType grammarType = (GrammarType) 
         * grammarTypeObj; 
         * 
         * String className = 
         * grammarType.getItemOrSourceOrParam().get(0). 
         * getValue().toString(); 
         * 
         * System.out.println("Class Name is : "+className); 
         */ 

         if (!classNameFromXml.toString().equalsIgnoreCase(className.toString())) { 
          continue; 
         } 

         // Getting all the response items corresponding to 
         // this class 
         for (ChatflowNode outputNodeObj : inputNodeType.getInputOrOutputOrDefault()) { 

          OutputNodeType outputNode = (OutputNodeType) outputNodeObj; 
          for (Object promptTypeObj : outputNode.getActionOrScriptOrPrompt()) { 

           PromptType promptType = (PromptType) promptTypeObj; 

           List<Serializable> responseItemObjs = promptType.getContent(); 
           for (Object responseItemObj : responseItemObjs) { 

            /* 
            * if (responseItemObj instanceof 
            * String) { 
            * System.out.println(((String) 
            * responseItemObj).trim()); } 
            */ 
            if (responseItemObj instanceof JAXBElement) { 
             // System.out.println("JAXBElement 
             // Instance"); 

             JAXBElement responseItem = (JAXBElement) responseItemObj; 

             System.out.println("The old response is : " + responseItem.getValue().toString()); 
             responseItem.setValue(response.toString()); 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 

     FileOutputStream os = new FileOutputStream(mor_dialog); 

     JAXBMarshaller.marshal(dialog, os);    
     //os.flush(); 
     os.close(); 

     //JAXBMarshaller.marshal(dialog, new FileOutputStream("src/main/java/com/sau/watson/dialog/xml/mor_dialog.xml")); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 


} 
+0

모든 코드는 제안/해결을 위해 서버 로그에서 출력됩니다. 당신은 그들을 제공 할 수 있습니다 –

+0

내가 일하고있는 코드를 추가했습니다. 감사 –

답변

0

그것을 마샬링, 입력 매개 변수를 기반으로 업데이트, XML을 마샬링 클래스 들어오는 요청 아래

@RestController 
public class HelloWorldRestController { 

@Autowired 
UserService userService; // Service which will do all data 
          // retrieval/manipulation work 

@Autowired 
DialogServiceXml dialogService; 

// Returning an xml file in the response 
@CrossOrigin(origins = "*") 
@RequestMapping(value = "/getUpdatedDialog", method = RequestMethod.POST, produces = "application/xml") 
public ResponseEntity<InputStreamResource> downloadXMLFile(@RequestBody Dialog dialog, 
     UriComponentsBuilder ucBuilder) throws IOException { 

    // Update the xml file named : "mor_dialog.xml" 
    dialogService.updateXml(new StringBuilder(dialog.getClassName()), new StringBuilder(dialog.getResponse())); 

    // Pick up the updated file from the classpath 
    ClassPathResource xmlFile = null; 
    try { 
     xmlFile = new ClassPathResource("mor_dialog.xml"); 
    } catch (Exception exception) { 
     exception.printStackTrace(); 
    } 

    // Code to prevent caching so that always the latest version of the file 
    // is being sent. 
    HttpHeaders httpHeaders = new HttpHeaders(); 
    httpHeaders.add("Cache-Control", "no-cache, np-store, must-revalidate"); 
    httpHeaders.add("Pragma", "no-cache"); 
    httpHeaders.add("Expires", "0"); 
    //httpHeaders.add("Access-Control-Allow-Origin", "http://nlc-mor-furniture.mybluemix.net"); 

    return ResponseEntity.ok().headers(httpHeaders).contentLength(xmlFile.contentLength()) 
      .contentType(MediaType.parseMediaType("application/octet-stream")) 
      .body(new InputStreamResource(xmlFile.getInputStream())); 
    } 
} 

을 받아들이 컨트롤러에 대한 코드입니다 src/main/resources 폴더는 maven이 war 파일을 빌드하기 전에 개발 컴퓨터에서만 사용할 수 있습니다. war를 빌드 한 후에는 classpath의 루트에서 war 파일에 자원이 추가됩니다. 파일을 업데이트하려면 classpath가 아닌 파일 시스템에서 파일에 액세스하고 싶을 것입니다.