未找到 Java 类型、类 org.json.JSONObject.... 和 MIME 媒体类型、application/json 的消息正文阅读器

Posted

技术标签:

【中文标题】未找到 Java 类型、类 org.json.JSONObject.... 和 MIME 媒体类型、application/json 的消息正文阅读器【英文标题】:A message body reader for Java type, class org.json.JSONObject.... and MIME media type, application/json was not found 【发布时间】:2014-03-20 20:53:28 【问题描述】:

我正在尝试从 android 调用 jersey restful web 服务。我的安卓代码是

客户端代码:

HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost("http://X.X.X.X:8080/RestfulService/rest/post");
post.setHeader("content-type", "application/json");

JSONObject dato = new JSONObject();
dato.put("email", email);
dato.put("password", password);

StringEntity entity = new StringEntity(dato.toString());
post.setEntity(entity);
HttpResponse resp = httpClient.execute(post);
String rs = EntityUtils.toString(resp.getEntity());
return rs

网络服务代码

@POST
@Produces( MediaType.APPLICATION_JSON )
@Consumes( MediaType.APPLICATION_JSON )   
public String Authmysql(JSONObject json) 

String password = (String) json.get("password");
String email = (String) json.get("email");

*I am using the string values to get the result from the database*


我得到的错误类似于 com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java type, class org.json.JSONObject.... and MIME media type, application/未找到 json。

非常感谢您的帮助

【问题讨论】:

可能重复:***.com/questions/12048804/… 您能列出附加到您的服务项目的库文件吗? @Joshi 我已经包含了所有的 jersey 1.18 jar 文件 您得到的是 415 Unsupported Media Type,不是吗?我也为此苦苦挣扎。 Tomcat,或者你后端的任何东西,除了字符串什么都不知道。如果您将 JSONObject 更改为 String,您会发现您实际上进入了 AuthMySQL() 方法,其中 json 只是作为字符串,但是您必须使其可解析,以便您可以使用您编写的代码或设置一些东西Jersey 可以用来将传入的 JSON 字符串转换为 JSONObject。这就是我卡住的地方。 (不知道这是否有帮助或为时已晚。) 【参考方案1】:

当您没有包含正确的库以将 json 正确映射到 POJO 或没有合适的 POJO 用于输入时,就会发生这种情况。

看看将jersey-json maven dependency 添加到您的项目中

【讨论】:

【参考方案2】:

如果您不想添加库,而只想获取解析后的 JSON(即不映射到 POJO),那么您只需实现一个基本的MessageBodyReader,例如:

public class JSONObjectMessageBodyReader implements MessageBodyReader<JSONObject> 
    @Override
    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) 
        return type == JSONObject.class && mediaType.equals(MediaType.APPLICATION_JSON_TYPE);
    

    @Override
    public JSONObject readFrom(Class<JSONObject> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException 
        try 
            // Using Apache Commons IO:
            String body = IOUtils.toString(entityStream, "UTF-8");
            return new JSONObject(body);
         catch(JSONException e) 
            throw new BadRequestException("Invalid JSON", e);
        
    

然后在您的网络服务代码中:

@POST
public Response doSomething(JSONObject body) 
   ...

【讨论】:

以上是关于未找到 Java 类型、类 org.json.JSONObject.... 和 MIME 媒体类型、application/json 的消息正文阅读器的主要内容,如果未能解决你的问题,请参考以下文章

未找到 Java 类型、类 org.json.JSONObject.... 和 MIME 媒体类型、application/json 的消息正文阅读器

java类定义未找到异常

(类型=内部服务器错误,状态=500)。未找到类型返回值的转换器:com.test.SearchVO 类

H2数据库用户定义的java函数类未找到

未找到类型的即时转换器:java.time.ZonedDateTime

如何使用 ResponseEntity 返回 JSONObject 而不是 HashMap? (未找到类型返回值的转换器:类 org.json.JSONObject)