Java Jersey:JSON不支持的媒体类型
我想创建一个RESTAPI来获取json数据并发送json数据 我的书本课:Java Jersey:JSON不支持的媒体类型,java,json,rest,jersey,http-status-code-415,Java,Json,Rest,Jersey,Http Status Code 415,我想创建一个RESTAPI来获取json数据并发送json数据 我的书本课: @Entity public class Book { @Id private String isbn; public Book() { } ...... } 我的图书服务: @Path("/books") public class BookService { @POST @Consumes(MediaType.APPLICA
@Entity
public class Book {
@Id
private String isbn;
public Book() {
}
......
}
我的图书服务:
@Path("/books")
public class BookService {
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response buyBook(Book book){
String isbn = book.getIsbn();
int number = book.getStock();
return Response.status(Response.Status.OK).entity("OK").build();
}
......
}
当我尝试与邮递员一起发布此邮件时:
POST /books HTTP/1.1
Host: localhost:5000
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 3099cd3a-184a-e442-270a-c118930df2b5
{
"isbn" : "",
"title" : "",
"author" : "",
"stock" : "2"
}
我的rest API向我发送以下响应:
HTTP ERROR 415
Problem accessing /books. Reason:
Unsupported Media Type
编辑:(使用pom.xml)
4.0.0
批发商服务
1.0-快照
批发商服务
org.glassfish.jersey.containers
jersey容器servlet
2.17
org.eclipse.jetty
码头servlet
9.2.10.v20150310
org.eclipse.jetty
jetty网络应用程序
9.2.10.v20150310
javax.ws.rs
javax.ws.rs-api
2.0.1
假如
org.hibernate.ogm
冬眠ogm mongodb
4.1.3.最终版本
javax.persistence
持久性api
1.0.2
org.eclipse.persistence
日食
2.5.2
公地郎
公地郎
2.6
罐子
org.apache.maven.plugins
maven依赖插件
2.4
复制依赖项
包裹
复制依赖项
1.7
1.7
批发商服务
项目中是否包含jackson jaxrs json提供程序
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.5.3</version>
</dependency>
com.fasterxml.jackson.jaxrs
jackson jaxrs json提供程序
2.5.3
一般来说:您的图书服务缺少您试图发布的标题、作者和股票。因此,为了使用JSON到POJO的实体转换,我们需要一个
MessageBodyReader
(有时称为提供者)来处理转换。有了Java,Jackson已经成为事实上的JSON库一段时间了,他们提供了一个支持JAX-RS的模块,正如
或者在web.xml中,将功能注册为提供程序类
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>
org.glassfish.jersey.jackson.JacksonFeature
</param-value>
</init-param>
jersey.config.server.provider.classnames
org.glassfish.jersey.jackson.JacksonFeature
书籍
没有成员标题
,作者
,和stock
。尝试在“buyBook”方法中的“Book Book”之前添加@BeanParam。我添加了@BeanParam,出现了一个新错误:无法发送响应错误500:javax.servlet.ServletException:java.lang.IllegalArgumentException:加载需要加载id。我的请求是:{“isbn”:“456”,“title”:“author”:“stock”:“2”}你确定这是导致415的原因吗?我认为这可能是415错误的原因(dm_fr可以轻松测试):Web服务器(运行网站)认为客户端发送的HTTP数据流标识的URL资源的实际媒体类型1)与请求中指定的媒体类型不一致,或2)与资源的当前数据不兼容,或3)与请求中指定的HTTP方法不兼容。是,这就是HTTP规范。您是否测试了使用JAX-RS时是否会发生这种情况?这可能是正确的答案,但问题可能出在其他地方。我想我们需要知道依赖关系。@dm_fr在查看pom后,是的,您缺少一个提供程序。但是,用(第一个)代替这个答案所建议的。这不需要额外的配置。它实际上包装了依赖项(上面的答案提供),因此我们不需要配置它
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey2.version}</version> <!-- 2.17 latest as of now -->
</dependency>
@ApplicationPath("/api")
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("...");
register(JacksonFeature.class);
}
}
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>
org.glassfish.jersey.jackson.JacksonFeature
</param-value>
</init-param>