java - JAX-RS消耗json问题

标签 java json rest jersey jax-rs

我在 java 中的 @Consumes JSON 对象存在编码问题。

我使用 glassfish 服务器 4.1。

Json 示例:

 {
   "name": "нцугкцукгцароцупацу",
   "email": "text@gmail.com",
   "message": "цкуцгкрпгукргшенгшукрпшгрук" 
 }

代码(来 self 的网络应用程序):

public static final String ENCODING = ";charset=utf-8";

@POST
@Path("sendTest")
@Produces(MediaType.APPLICATION_JSON + ENCODING)
@Consumes(MediaType.APPLICATION_JSON + ENCODING)
public String sendTest(@Context HttpServletRequest request, JsonObject jsonObject ) {
    try {
        logger.info("encoding - " + request.getCharacterEncoding());
        logger.info("name - " + new String(jsonObject.getName().getBytes("UTF-8"), "UTF-8"));

        logger.info("msg - " + jsonObject.getMessage());
    } catch (Exception e) {
        logger.error(e);
        return "ERROR";
    }
    return "OK";
}

JsonObject 它是一个简单的 pojo 对象和 jpa 实体。

    import java.io.Serializable;

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;

    @Entity
    @Table(name = "jsonObject")
    public class JsonObject implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    private String email;

    private String message;

    public JsonObject() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        JsonObject other = (JsonObject) obj;
        if (id == null) {
            if (other.id != null) {
                return false;
            }
        } else if (!id.equals(other.id)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "JsonObject [id=" + id + ", name=" + name + ", email=" + email + ", message=" + message + "]";
    }

}

结果:

[ INFO] encoding - UTF-8.
[ INFO] name - ??????????.          
[ INFO] msg - ???????????.

当我尝试这样时:

@POST
@Path("sendTestParam")
@Produces(MediaType.APPLICATION_JSON + ENCODING)
@Consumes(MediaType.APPLICATION_JSON + ENCODING)
public String sendTestParam(@Context HttpServletRequest request, @QueryParam("name") String name, @QueryParam("email") String email,
        @QueryParam("message") String message) {
    try {
        logger.info("encoding - " + request.getCharacterEncoding());
        logger.info("name - " + name);
        logger.info("email - " + email);
        logger.info("msg - " + message);
    } catch (Exception e) {
        logger.error(e);
        return "ERROR";
    }
    return "OK";
}

一切正常; 但我想使用 json 对象,并以某种方式为该对象设置编码(我猜是 UTF-8)...:) 我也尝试过

@Consumes(MediaType.APPLICATION_JSON)
@Consumes("application/json")
@Consumes("application/json;charset=utf-8")

但没有任何改变:(

我会很高兴得到任何帮助。

最佳答案

你不能直接传递 JSON 对象,但你可以将它映射到 DTO 并传递

假设你的参数我有一个 DTO,我将使用它而不是 Json 对象

class DummyTO {

    private String name;
    private String email;
    private String message;
    // getter setter
}

@POST
@Path("sendTest")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String sendTest(@Context HttpServletRequest request, DummyTO dummtTO ) {
    try {

        dummyTO.getMessage();


    } catch (Exception e) {
        logger.error(e);
        return "ERROR";
    }
    return "OK";
}

关于java - JAX-RS消耗json问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31115653/

相关文章:

java - 如何将数组从 TMDB 保存到 SQLite

java - 获取 JSON 响应作为 Java 中 Rest 调用的一部分

javascript - JSON.Stringify |将结果输出到屏幕上,并带有引号标签 ''

json - 编码/解码时 UIImage 不等效

linux下工具安装Java异常

rest - 如何使用 Aqueduct 创建到 MySQL 的持久存储?

javascript - 带有 REST 服务器的 Angular JS : Use and set temporary data(cookie or others)

java - Java 中相同的密码会产生不同的 AES key

java - Maven (eclipse) 使用阴影 jar 代替原始 jar

java - Firebase 可调用函数出错