2016-06-06 6 views
2

Ich habe diese Maven-Webanwendung, die eine Liste der registrierten Benutzer gibt und die Sie einen Benutzer hinzufügen können. Die Benutzer werden in eine MySQL-Datenbank gespeichert Erinnerungen und kann durch eine Verbindung Erinnerungen Erinnerungen zugegriffen werden, die nur ein Konto Erinnerungen mit Passwort "Erinnerungen" zugreifen können. javax.json.JsonException: Kann Codierung nicht automatisch erkennen, nicht genug Zeichen

  • Ein vollständiger Name (fullname)
  • Dieser Benutzer durch die folgende Java-Klasse dargestellt wird

    • Ein Benutzername:

      package entity; 
      
          // imports go here 
      
          @Entity 
          @Table(name = "tblUser") // Required because User is a reserved word in SQL. 
          @NamedQueries({ 
           @NamedQuery(name = "User.findAll", query = "SELECT u FROM User u") 
          }) 
          public class User { 
      
           @Id 
           private String username; 
      
           public String getUsername() { 
            return username; 
           } 
      
           public void setUsername(String username) { 
            this.username = username; 
           } 
      
           private String fullName; 
      
           public String getFullName() { 
            return fullName; 
           } 
      
           public void setFullName(String fullName) { 
            this.fullName = fullName; 
           } 
      
           @Override 
           public int hashCode() { 
            int hash = 7; 
            hash = 83 * hash + Objects.hashCode(this.username); 
            return hash; 
           } 
      
           @Override 
           public boolean equals(Object obj) { 
            if (obj == null) { 
             return false; 
            } 
      
            if (getClass() != obj.getClass()) { 
             return false; 
            } 
      
            final User other = (User) obj; 
      
            return Objects.equals(this.username, other.username); 
           } 
      
          } 
      

      ist ein Benutzer definiert durch Ich habe auch UserListServlet:

      package servlet; 
      
      // imports 
      
      @WebServlet("/api/users") 
      @Transactional 
      public class UserListServlet extends HttpServlet { 
      
          @PersistenceContext 
          private EntityManagerFactory emf; 
      
          @Override 
          protected void doGet(HttpServletRequest request, HttpServletResponse response) 
           throws ServletException, IOException 
          { 
           EntityManager em = emf.createEntityManager(); 
           List<User> users = em.createNamedQuery("User.findAll", User.class) 
                .getResultList(); 
           em.close(); 
      
           JsonArrayBuilder jsonUsers = Json.createArrayBuilder(); 
           users.stream().map(user -> { 
            JsonObjectBuilder jsonUser = Json.createObjectBuilder(); 
            jsonUser.add("username", user.getUsername()); 
            if (user.getFullName() != null) { 
             jsonUser.add("fullName", user.getFullName()); 
            } 
            return jsonUser; 
           }).forEach(jsonUsers::add); 
      
           try (JsonWriter jsonOutput = Json.createWriter(response.getOutputStream())) { 
            jsonOutput.writeArray(jsonUsers.build()); 
           } 
          } 
      
          @Override 
          protected void doPost(HttpServletRequest request, HttpServletResponse response) 
           throws ServletException, IOException 
          { 
           User user = new User(); 
           try (JsonReader jsonInput = Json.createReader(request.getInputStream())) { 
            JsonObject jsonUser = jsonInput.readObject(); 
            user.setUsername(jsonUser.getString("username", null)); 
            user.setFullName(jsonUser.getString("fullName", null)); 
           } 
      
           if (user.getUsername() == null) { 
            response.sendError(400, "Username not specified"); 
            return; 
           } 
      
           user.setUsername(user.getUsername().trim()); 
      
           if (user.getUsername().length() < 8) { 
            response.sendError(400, "Username too short"); 
            return; 
           } 
      
           EntityManager em = emf.createEntityManager(); 
      
           if (em.find(User.class, user.getUsername()) != null) { 
            response.sendError(400, "Username already in use"); 
            return; 
           } 
      
           if (user.getFullName() != null) { 
            user.setFullName(user.getFullName().trim()); 
            if (user.getFullName().length() == 0) { 
             user.setFullName(null); 
            } 
           } 
      
           em.persist(user); 
           em.close(); 
      
           response.setStatus(201); 
          } 
      
      } 
      

      ich auch eine Indexseite (HTML) haben:

      <!doctype html> 
          <html lang="en"> 
          <head> 
          <title>Reminders User List</title> 
          <meta charset="utf-8"> 
          </head> 
          <body> 
      
          <h3>Registered users:</h3> 
          <ul id="users"> 
          </ul> 
      
          <h3>Add a user:</h3> 
          <form> 
           <p> 
            <label for="username">Username:</label> 
            <input id="username" type="text"> 
           </p> 
           <p> 
            <label for="fullName">Full name:</label> 
            <input id="fullName" type="text"> 
           </p> 
           <p> 
            <button id="submit" type="button">Add</button> 
           </p> 
          </form> 
      
          <p id="error"></p> 
      
          <script src="js/jquery-2.1.0.js"></script> 
          <script src="js/userlist.js"></script> 
      </body> 
      

      Ich habe auch userlist.js:

      onload = function() 
      { 
          updateList(); 
          $("#submit").click(submitUser); 
      }; 
      
      function updateList() 
      { 
          var request = new XMLHttpRequest(); 
          request.open("GET", "http://localhost:8080/reminders/api/users"); 
          request.onload = function() { 
           if (request.status === 200) { 
            $("#users").empty(); 
            var users = JSON.parse(request.responseText); 
            for (var i = 0; i < users.length; i++) { 
             var item = $("<li>"); 
             if (users[i].fullName) { 
              item.text(users[i].fullName + " (" + users[i].username + ")"); 
             } else { 
              item.text(users[i].username); 
             } 
             $("#users").append(item); 
            } 
            $("#error").empty(); 
           } else { 
            $("#error").text("Unable to load user list"); 
           } 
          }; 
          request.send(null); 
      } 
      
      function submitUser() 
      { 
          var user = {}; 
          user.username = $("#username").val(); 
          user.fullName = $("#fullName").val(); 
      
          var request = new XMLHttpRequest(); 
          request.open("POST", "http://localhost:8080/reminders/api/users"); 
          request.onload = function() { 
           if (request.status === 201) { 
            $("#error").empty(); 
            updateList(); 
           } else { 
            $("#error").text("Unable to add user"); 
           } 
          }; 
          request.setRequestHeader("Content-Type", "application/json"); 
          request.send(JSON.stringify(user)); 
      } 
      

      Nun, wenn ich etwas über Postman posten, ich Holen Sie sich das folgende Protokoll:

      Error processing request 
      Context Path:/reminders 
      Servlet Path:/api/users 
      Path Info:null 
      Query String:{%22username%22=%22Sinicon12%22,%20%22fullName%22:%22Some%20Name%22} 
      Stack Trace 
      javax.json.JsonException: Cannot auto-detect encoding, not enough chars 
      org.glassfish.json.UnicodeDetectingInputStream.detectEncoding(UnicodeDetectingInputStream.java:131) 
      // etc. ... 
      

      Weiß jemand, was zu tun ist, damit der Fehler verschwindet?

      PS: Ich weiß, dass es eine ähnliche Frage hier, aber die Antwort darauf ist JSonWriter zu schließen, die nicht

    Antwort

    0

    Zitat von RFC 4627 in meinem Fall funktionieren:

    JSON Text MUSS in Unicode codiert sein. Die Standardcodierung ist
    UTF-8.

    Da die ersten beiden Zeichen eines JSON Text immer ASCII sein Zeichen [RFC0020] ist es möglich, ob ein Oktett
    Strom UTF-8, um zu bestimmen, UTF-16 (BE oder LE) oder UTF -32 (BE oder LE), indem man
    nach dem Muster der Nullen in den ersten vier Oktetts sucht.

     00 00 00 xx UTF-32BE 
         00 xx 00 xx UTF-16BE 
         xx 00 00 00 UTF-32LE 
         xx 00 xx 00 UTF-16LE 
         xx xx xx xx UTF-8 
    

    So wahrscheinlich ist Ihr Strom leer. Auch wenn Sie einen HTTP-Statuscode von 200 erhalten, prüfen Sie, ob etwas zurückgeschrieben wurde.