0

我正在开发一个 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、根据输入参数对其进行更新、然后将其编组返回的类

@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();
    }
}


}
4

1 回答 1

0

src/main/resources 文件夹仅在 maven 构建 war 文件之前在您的开发机器上可用。构建战争后,资源将从类路径的根目录添加到战争文件中。如果要更新文件,那么您可能希望从文件系统而不是类路径访问文件。

于 2016-07-28T03:36:15.553 回答