JAXB - Маршаллер пишет в системный вывод, но не в XML файл - PullRequest
0 голосов
/ 26 февраля 2020

В настоящее время я разрабатываю туристическую услугу, и мы должны записать информацию о пользователе в файл XML, используя JAXB Marshalling. При запуске приложения на сервере Tomcat я набираю информацию в текстовом поле и нажимаю «Зарегистрировать», формат XML записывается в консоли, но фактически не записывается в файл XML. На данный момент у меня есть мои «account. xml» в каталоге «src / main / resources». Вот информация о моем контроллере. Я не совсем уверен, почему он не будет записывать в файл XML:

@Controller
public class AccountController {
    @RequestMapping(value = "/register", method = RequestMethod.GET)
    public String registerPage(Locale locale, Model model) {
        return "register";
    }

    @RequestMapping(value = "/home", method = RequestMethod.POST)
    public String register(@RequestParam("name") String name, @Validated User user, Model model) throws JAXBException, IOException{

        Account account = new Account();
        account.setName(name);
        account.setEmail("email");
        account.setPassword("password");

        try {


            File file = ResourceUtils.getFile("classpath:accounts.xml");


            JAXBContext jaxbContext = JAXBContext.newInstance(Account.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            jaxbMarshaller.marshal(account, file);
            jaxbMarshaller.marshal(account, System.out);


              } catch (JAXBException e) {
                  e.printStackTrace();
              }


        model.addAttribute("name", user.getName());
        return "user";
    }


}

Мой вывод на консоль выглядит следующим образом, когда я отправляю информацию:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<account>
    <email>email</email>
    <name>testName</name>
    <password>password</password>
</account>

Любой была бы признательна за помощь!

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Если вы действительно хотите это сделать, вы должны убедиться, что ваша WAR развернута, и посмотреть, доступны ли учетные записи. xml доступна для записи. Посмотрите на это: Как я могу сохранить файл в путь к классу

Кроме того, я вижу, что вы создаете JAXBContext в каждом запросе. JAXB spe c говорит:

Чтобы избежать накладных расходов, связанных с созданием экземпляра JAXBContext, приложению JAXB рекомендуется повторно использовать экземпляр JAXBContext. Реализация абстрактного класса JAXBContext должна быть поточно-ориентированной, поэтому несколько потоков в приложении могут совместно использовать один и тот же экземпляр JAXBContext.

Вам следует переместить JAXBContext в поле stati c, так как нужен только один экземпляр.

0 голосов
/ 26 февраля 2020

Файл file = ResourceUtils.getFile ("classpath: accounts. xml"); является объектом "java .io.File", который ссылается на файл с учетными записями. xml часть пути к классам. Это часть файла war, развертываемого в вашем tomcat.

Вам необходимо использовать объект File, как в File file = new File ("/ tmp / accounts. xml")

...