mysql - javax.json.JsonException : Cannot auto-detect encoding, 没有足够的字符

标签 mysql json maven http-post postman

我有这个 Maven 网络应用程序,它提供了一个注册用户列表并允许您添加用户。用户被保存到 MySQL 数据库 reminders 中,可以通过连接 reminders 访问,只有密码为“reminders”的帐户 reminders 可以访问.

用户定义为:

  • 用户名
  • 全名(fullName)

此用户由以下 Java 类表示:

    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);
        }

    }

我还有 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);
    }

}

我还有一个索引页(HTML):

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

我还有 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));
}

现在,每当我通过 Postman 发布内容时,我都会收到以下日志:

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

有谁知道该怎么做才能使错误消失?

PS:我知道这里有一个相关的问题,但是那个问题的答案是关闭 JSonWriter,这对我来说不起作用

最佳答案

引自 RFC 4627 :

JSON text SHALL be encoded in Unicode. The default encoding is
UTF-8.

Since the first two characters of a JSON text will always be ASCII characters [RFC0020], it is possible to determine whether an octet
stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking
at the pattern of nulls in the first four octets.

       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

所以您的流可能是空的。即使您收到 200 HTTP 状态代码,也要检查是否有回写内容。

关于mysql - javax.json.JsonException : Cannot auto-detect encoding, 没有足够的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37658187/

相关文章:

Mysql Trigger和Event在一起?

Mysql 按多个具有不同值的列进行分组

json - 类似字典的 JSON 模式

java - 在android中解析JSON显示不匹配错误

php - CodeIgniter从涉及mysql数据库的数据表中删除行

PHP Web 应用程序 : mysql database design best practices question

json - 管道后的 '@-'在PowerShell中是什么意思?

java - 我想在我的 Maven 设置 xml 中设置两个镜像,需要帮助,不知道我在这里做错了什么

Maven 3 多模块构建尝试在多模块 POM 本身上运行目标

android - maven构建android项目: specify the location of aidl file