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
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