我有这个 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/