【问题标题】:MarkLogic: No stream to writeMarkLogic:没有要写入的流
【发布时间】:2018-02-12 23:51:46
【问题描述】:

我有一个问题,我有一个从 AngularJs 前端获取参数的方法,用它们创建一个对象,将对象作为 XML 文件写入文件夹,然后应该将该 XML 文件写入MarkLogic 数据库。

但是,它应该写入数据库的部分看起来好像文件不存在,即使它确实存在:

代码如下:

@RequestMapping(value = "/add/korisnik", method = RequestMethod.POST)
public String addKorisnik(@RequestParam String ime, @RequestParam String prezime, @RequestParam String username, @RequestParam String password, @RequestParam String orcid, @RequestParam String role) throws JAXBException, FileNotFoundException{

    Korisnik.Roles roles = new Korisnik.Roles();
    roles.setRole(role);
    Korisnik k = new Korisnik();
    k.setIme(ime);
    k.setPrezime(prezime);
    k.setUsername(username);
    k.setPassword(password);
    k.setOrcid(orcid);
    k.setRoles(roles);

    System.out.println(k.toString());

    // create JAXB context and instantiate marshaller
    JAXBContext context = JAXBContext.newInstance(Korisnik.class);
    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

    StringWriter sw = new StringWriter();
    m.marshal(k, sw);

    // Write to File
    File f = new File("src/main/resources/data/korisnici/" + k.getUsername() + ".xml");
    if (f.exists()) { 
        return "Username already taken.";
    }
    else {
        m.marshal(k, new File("src/main/resources/data/korisnici/" + k.getUsername() + ".xml"));
    }

    // acquire the content
    InputStream docStream = ObjavaNaucnihRadovaApplication.class.getClassLoader().getResourceAsStream(
                "data/korisnici/" + k.getUsername() + ".xml");

    // create the client
    DatabaseClient client = DatabaseClientFactory.newClient(MarkLogicConfig.host,
                MarkLogicConfig.port, MarkLogicConfig.admin,
                MarkLogicConfig.password, MarkLogicConfig.authType);

    // create a manager for XML documents
    XMLDocumentManager docMgr = client.newXMLDocumentManager();

    // create a handle on the content
    InputStreamHandle handle = new InputStreamHandle(docStream);

    // write the document content
    docMgr.write("http://localhost:8011/korisnici/" + k.getUsername()+".xml", handle);  

    //release the client
    client.release();

    return "OK";
}

【问题讨论】:

    标签: java xml marklogic


    【解决方案1】:

    几个问题。

    • 首先,您写入的文件与您读取的文件不同。您正在写入相对于 JVM(应用程序服务器)的当前目录的“src/main/resources/data/korisnici/..”。您正在从类路径资源目录中读取——不太可能相同。您可以简单地重用相同的 File 对象,然后它们将是相同的。

    • 其次,您不需要将这么小的对象写入磁盘,只需将其写入内存流(如 ByteArrayStream() )。

    【讨论】:

      【解决方案2】:

      听起来好像类加载器没有找到您的文件。

      如果您已经有一个刚刚编写的File 对象,为什么不从它构造一个InputStream,而不是尝试从不同构造的相对路径中找到它?

      InputStream docStream = new FileInputStream(f);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        • 2012-11-18
        • 2017-05-13
        • 1970-01-01
        • 2014-06-04
        相关资源
        最近更新 更多