2016-07-28 10 views
0

私は応答としてXMLファイルを返すSpring Restful Webサービスに取り組んでいます。このXMLファイルは、EclipseプロジェクトのMAVENビルドのmain/resourcesフォルダ内に配置されています。このサービスは、呼び出し元から特定のパラメータを受け取り、それらのパラメータに基づいて、XMLファイルを更新する必要があります。このプロジェクトは、運用サーバーにWARとして展開されます。私のローカルプロジェクトでは、xmlファイルが更新されているのがわかりますが、実動サーバーでは更新されていません。運用サーバーでこれをどのように動作させることができますか?以下Spring REST Webサービス| 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())); 
    } 
} 

、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

それをマーシャリング着信要求を受け付ける制御するためのコードでありますsrc/main/resourcesフォルダは、mavenがwarファイルをビルドする前に、開発マシンでのみ使用できます。戦争を構築した後、リソースはクラスパスのルートからwarファイルに追加されます。 ファイルを更新したい場合は、クラスパスからではなく、ファイルシステムからファイルにアクセスすることをお勧めします。

関連する問題