【问题标题】:JSON to POJO mapping in RestRest 中的 JSON 到 POJO 映射
【发布时间】:2017-03-04 15:49:53
【问题描述】:

我是 Web 服务的新手。我能够实现正常的获取和发布,但是当我尝试使用 MediaType.APPLICATION_JSON 实现发布方法时。我收到错误。请让我知道这里出了什么问题。

我的资源:

package com;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("Hi")
public class Resource {
@GET()
@Produces(MediaType.TEXT_HTML)
public String x() {
    return "HI HI";
}

@POST()
// @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_HTML)
public String x1() {
    return "HI HI post normal";
}

@POST()
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_HTML)
public String x2(Pojo p) {
    return "HI HI post jason" + p.getName();

}

}

_----------

我的 Web.xml

.......

     <servlet>
     <servlet-name>Bakchodi</servlet-name>
     <servlet-Class>          
     com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
     <init-param>
     <param-name>com.sun.jersey.config.property.packages</param-name>
     <param-value>com</param-value>
     </init-param>
     <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
     <servlet-name>Bakchodi</servlet-name>
     <url-pattern>/rest/*</url-pattern>
 </servlet-mapping>`

波乔

 package com;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="someName")
public class Pojo {
private String name;

public String getName() {
    return name;
}

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

public String toString() {
    return "Pojo[name =" + name + "]";
}

}

pom.xml 中包含的罐子

asm,jersey{core,server,client,bundle,json,}andcommon-loggings

请告诉我缺少什么。

错误:

    status:415
    server console:SEVERE: A message body reader for Java class com.Pojo, and Java type class com.Pojo, and MIME media type application/json was not found.
    The registered message body readers compatible with the MIME media type are:
    application/json ->
      com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
      com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
      com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
    */* ->
      com.sun.jersey.core.impl.provider.entity.FormProvider
      com.sun.jersey.core.impl.provider.entity.StringProvider
      com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
      com.sun.jersey.core.impl.provider.entity.FileProvider
      com.sun.jersey.core.impl.provider.entity.InputStreamProvider
      com.sun.jersey.core.impl.provider.entity.DataSourceProvider                                                           com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
      com.sun.jersey.core.impl.provider.entity.ReaderProvider
      com.sun.jersey.core.impl.provider.entity.DocumentProvider
              com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
              com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
      com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
              com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
              com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
      com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
      com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
      com.sun.jersey.core.impl.provider.entity.EntityHolderReader
              com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
              com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General        

【问题讨论】:

标签: java json web-services rest


【解决方案1】:

您的帖子中缺少一些信息,例如 URI 结构、您使用的 Servlet 规范的版本、您调用资源的方式...

无论如何,您可以检查以下内容:

  1. 你使用的注解@POST()对我来说很奇怪,所以你最好去掉括号:

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_HTML)
    public String x2(Pojo p) {
        return "HI HI post jason" + p.getName();
    }
    
  2. 正如您所指定的,您期待一个 POST 请求,这意味着您必须在请求正文中发送 JSON 文本,例如:

    { "name": "RAHUL" }
    
  3. 除非您使用 HTML 表单,否则普通浏览器不提供发送 POST 请求的方法(至少我不知道);所以你需要一些浏览器插件来发送 JSON 作为请求体;您可以为 Chrome 使用 Postman 或为 Firefox 使用 RESTClient,...,或者使用 Apache Wink 等 REST 客户端框架,...

  4. 安装您喜欢的浏览器插件后,您必须将请求标头Content-Type 设置为application/json,以便框架知道您正在发送JSON 正文;我认为这甚至是您收到status:415) 的原因。

【讨论】:

  • 感谢您的建议...如何运行相同的代码(相信我,没有任何更改)...在我的系统重新启动后(我猜,因为它也导致了 Eclipse 的重新启动)...无论如何,再次感谢。
【解决方案2】:

相同的代码运行(相信我,没有任何改变)..我的系统重新启动后(我猜,因为它也导致了 Eclipse 的重新启动).. 在此之前,我进行了 maven-clean、maven 安装、从 tomcat 配置中删除项目至少 11-12 次,但总是出现此错误。

所以我想这现在适用于想要在 rest api 中使用 application/json 示例的人.....(对于发送请求,您可以使用 Advanced rest client 或 postman 等应用程序,或者您可以创建一个html 页面中的表单并通过使用 stringify() 更改表单来提交 json 对象,然后提交它..我为此目的使用了 ajax)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多