当我尝试在服务器上发送消息时,响应是:不支持的媒体类型。 (415)
{
"street": "Alex",
"picture": "fsdfs"
}
我使用Jersey 2.7。我打电话给GET时很好,但问题出在POST方法上。 进入项目我包括org.glassfish.jersey.media:jersey-media-json-jackson和il \ ncluded code in like this topic
public static void main(String[] args) throws Exception, RuntimeException {
final Application application = new ResourceConfig()
.packages("org.template")
.register(JacksonFeature.class);
server = new Server(PORT_NUMBER);
ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
servletContextHandler.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class));
servletContextHandler.addServlet(DefaultServlet.class, "/*");
server.start();
server.join();
}
简单API:
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ExampleAPI {
@GET
@Path("hello")
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello World";
}
@POST
@Path("/create")
public Response create(BeanInfo bean) {
return Response.created(UriBuilder.fromResource(BeanInfo.class)
.path("{picture}").build(bean.getPicture()))
.entity(bean.toString())
.build();
}
}
这里有什么问题?我应该将对象映射到json吗?
的BeanInfo:
@JsonProperty("picture")
private final String picture;
@JsonProperty("street")
private final String street;
...
答案 0 :(得分:2)
这可能是因为您在调用服务时错误地设置了Content-Type标题。您必须将其设置为" application / json"。在我看来,您的服务器端已正确定义,问题出在客户端以及它如何调用API。
415不支持的媒体类型
415(不支持的媒体类型)状态代码表示 源服务器因为有效负载而拒绝为请求提供服务 是在目标资源上使用此方法不支持的格式。 格式问题可能是由于指示的请求 内容类型或内容编码,或作为检查的结果 数据直接。
答案 1 :(得分:1)
问题在于bean类。我使用了构建器模式,杰克逊无法对其进行解码。 我在类和构建器中添加了注释,现在工作正常。
@JsonDeserialize(builder = BeanInfo.Builder.class)
public class BeanInfo{ ...
和建设者:
@JsonPOJOBuilder(buildMethodName = "build", withPrefix = "set")
public static class Builder {...