JAXB Marshal / Unmarshal, вызывающий удаление данных - PullRequest
0 голосов
/ 27 февраля 2020

Я пишу приложение, в котором у пользователя есть опция регистрации и входа, где информация хранится и извлекается через файл XML. Проблема, с которой я сталкиваюсь, заключается в том, что после того, как пользователь зарегистрируется, остановит сервер Tomcat и снова включит его, вместо повторной регистрации, он должен иметь возможность войти в систему. Это работает 50% времени, но когда это не работает, я получаю следующую ошибку, и мои XML данные удаляются:

javax.xml.bind.UnmarshalException- with linked exception: [org.xml.sax.SAXParseException; systemId: file:/C:/Users/Kevin/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/KDTravelService/WEB-INF/classes/accounts.xml; lineNumber: 1; columnNumber: 1; Premature end of file.]

Вот мой код контроллера, который включает в себя маршалинг и демаршаллинг:

@RequestMapping(value = "/registration-complete", method = RequestMethod.POST)
    public String register(@RequestParam("name") String name, @RequestParam("email") String email, @RequestParam("password") String password, @Validated User user, Model model) throws JAXBException, IOException, URISyntaxException{

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

        accountName = name;
        accountEmail = email;
        accountPassword = password;

        try {

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

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

            // output pretty printed
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            jaxbMarshaller.marshal(account, file);
            jaxbMarshaller.marshal(account, System.out);
            System.out.print(file.getAbsolutePath());


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


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


    @RequestMapping(value = "/login-complete", method = RequestMethod.POST)
    public String login(@RequestParam("email") String email, @RequestParam("password") String password, @Validated User user, Model model) throws JAXBException, IOException, NullPointerException{

        try {
            File file = ResourceUtils.getFile("classpath:accounts.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(Account.class);

            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            Account account = (Account) jaxbUnmarshaller.unmarshal(file);

            accountName = account.getName();
            accountEmail = account.getEmail();
            accountPassword = account.getPassword();

            if (email.contentEquals(accountEmail) && password.contentEquals(accountPassword)){
                return "loginComplete";
            }
            else {
                return "loginFail";
            }


        } catch (JAXBException e) {
            model.addAttribute("error", e.toString());
            return "error";
        }

    }

Когда пользователь регистрируется один раз, информация должна храниться в XML и не требовать повторной регистрации. И я не совсем уверен, почему это sporadi c с точки зрения того, когда он работает или нет; Я не могу вызвать это, это происходит случайно.

...