簡體   English   中英

Spring REST Web服務| 更新XML並發送響應

[英]Spring REST Web Service | Update an XML and send it in response

我正在使用Spring Restful Web服務,其中我將返回一個xml文件作為響應。 該XML文件位於Eclipse中的MAVEN項目構建的main / resources文件夾中。 該服務接受來自調用方的某些參數,並應基於這些參數更新XML文件。 該項目作為WAR部署在生產服務器中。 在我的本地項目上,我可以看到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,根據輸入參數對其進行更新然后封送回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();
    }
}


}

src / main / resources文件夾僅在maven生成war文件之前在開發計算機上可用。 建立戰爭之后,資源將從類路徑的根目錄添加到戰爭文件。 如果要更新文件,則可能要從文件系統而不是從類路徑訪問文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM