java 封装postman_使用Postman插件发送复杂对象测试java应用程...

本文档描述了在使用Postman测试基于jersey 1.8的Java RESTful Web服务时遇到的415 UnsupportedMediaType异常。问题出现在尝试将JSON格式的Loc对象发送到服务时,服务无法正确解析请求。作者探讨了可能的原因,包括缺少适当的message body reader,并分享了尝试的不同解决方案,如更改Content-Type和使用Genson库。尽管出现错误,但作者继续寻求将JSON字符串映射回Loc对象的方法。
摘要由CSDN通过智能技术生成

我用jersey 1.8库创建了一个java restful ws,它是一个名为Loc的Pojo的一个post操作并使用JSON格式.

这是web服务:

import javax.ws.rs.Consumes;

import javax.ws.rs.POST;

import javax.ws.rs.Path;

import javax.ws.rs.core.MediaType;

import javax.ws.rs.core.Response;

import org.hibernate.Session;

import org.hibernate.Transaction;

import persistence.HibernateUtil;

import entities.Loc;

@Path("EnvironmentService")

public class Environment {

@POST

@Path("/post/location")

@Consumes(MediaType.APPLICATION_JSON)

public Response createLocation(Loc location) {

System.out.println("ENTROU NO LOCATION");

Session session = HibernateUtil.openNewSession();

Transaction tx = session.beginTransaction();

session.save(location);

tx.commit();

session.close();

String result = "Location saved";

return Response.status(201).entity(result).build();

}

我想向webservice发送一个Loc对象:

/**

* Loc is a hibernate enitity class which represents a raw data table for location entries.*/

@Entity

@XmlRootElement

public class Loc implements Serializable {

private static final long serialVersionUID = 1184003645439013748L;

@Id

@GeneratedValue(strategy = GenerationType.TABLE)

private long id;

private double latitude;

private double longitude;

private long time;

private double accuracy;

private String provider;

@Column(name = "yProcessed", nullable = false, columnDefinition = "int default '0'")

private int yProcessed = 0;

@Column(name = "zClass", nullable = false, columnDefinition = "double default 0.0")

private double zClass = 0d;

public long getId() {

return id;

}

public void setId(long id) {

this.id = id;

}

public double getLatitude() {

return this.latitude;

}

public void setLatitude(double latitude) {

this.latitude = latitude;

}

public double getLongitude() {

return this.longitude;

}

public void setLongitude(double longitude) {

this.longitude = longitude;

}

public long getTime() {

return this.time;

}

public void setTime(long time) {

this.time = time;

}

@Override

public String toString() {

return "latitude: " + latitude + " longitude: " + longitude + "time: "

+ time;

}

public double getAccuracy() {

return accuracy;

}

public void setAccuracy(double accuracy) {

this.accuracy = accuracy;

}

public int getyProcessed() {

return yProcessed;

}

public void setyProcessed(int yProcessed) {

this.yProcessed = yProcessed;

}

public double getzClass() {

return zClass;

}

public void setzClass(double zClass) {

this.zClass = zClass;

}

public String getProvider() {

return provider;

}

public void setProvider(String provider) {

this.provider = provider;

}

}

这是我用于jersey配置的web.xml文件我正在使用的jar是1.8:

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

id="WebApp_ID" version="2.5">

RememberMeServer

Jersey REST Service

com.sun.jersey.spi.container.servlet.ServletContainer

com.sun.jersey.config.property.packages

webservices

com.sun.jersey.api.json.POJOMappingFeature

true

1

Jersey REST Service

/rest/*

我正在使用chrome中的postman插件测试这个web服务.

我给他以下url http:// localhost:8080 / RememberMeServer / rest / EnvironmentService / post / location

哪个是对的.

我把以下标题传给他:

Content-Type application/json

并选择raw和JSON类型格式并发送以下使用GSON从Loc对象收集的JSON代码:

{"provider":"network","latitude":39.1237894,"longitude":-9.2501239,"accuracy":34.5,"time":1400957412206}

在Postman插件中,我得到了415:UnsupportedMediaType,在eclipse中我得到了这个球衣错误:

Mai 25, 2014 12:49:42 PM com.sun.jersey.spi.container.ContainerRequest getEntity

SEVERE: A message body reader for Java class entities.Loc, and Java type class entities.Loc, 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.MimeMultipartProvider

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

从我理解的实体来看,这很奇怪.Loc应该在某处,但事实并非如此.

类Loc中的一些anotations用于Hibernate Framework,而不关心webservice.我认为他们不会干涉.

我无法弄清楚如何传递这个问题我想先测试这个webservice,然后我去客户端.有谁知道如何解决这个问题?

编辑:

这是邮递员的请求预览:

POST /RememberMeServer/rest/EnvironmentService/post/location HTTP/1.1

Host: localhost:8080

Content-Type: application/json

Cache-Control: no-cache

{"provider":"network","latitude":"39.1237894","longitude":"-9.2501239","accuracy":"34.5","time":"1400957412206"}

EDIT2

当我将类型更改为text / plain并将参数更改为字符串时,我认为问题是将json字符串映射到Loc对象的任何帮助?

EDIT3:

现在我在post webservice中将类型更改为字符串,并且他收到json相当不错,但我怎么能用Loc对象而不是字符串呢?

EDIT4

通过添加Genson有一个用户sugestion实际上将错误更改为内部服务器错误,这里是stacktrace:

Mai 28, 2014 2:12:26 PM com.sun.jersey.spi.container.ContainerResponse logException

SEVERE: Mapped exception to response: 500 (Internal Server Error)

javax.ws.rs.WebApplicationException: com.owlike.genson.JsonBindingException: Could not deserialize to type class java.lang.String

at com.owlike.genson.ext.jaxrs.GensonJsonConverter.readFrom(GensonJsonConverter.java:127)

at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:490)

at com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)

at com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:86)

at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)

at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203)

at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)

at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)

at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)

at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)

at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)

at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)

at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542)

at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473)

at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)

at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)

at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)

at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:540)

at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:715)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

at java.lang.Thread.run(Thread.java:745)

Caused by: com.owlike.genson.JsonBindingException: Could not deserialize to type class java.lang.String

at com.owlike.genson.Genson.deserialize(Genson.java:442)

at com.owlike.genson.ext.jaxrs.GensonJsonConverter.readFrom(GensonJsonConverter.java:125)

... 38 more

Caused by: com.owlike.genson.stream.JsonStreamException: Readen value can not be converted to String

at com.owlike.genson.stream.JsonReader.valueAsString(JsonReader.java:193)

at com.owlike.genson.convert.DefaultConverters$StringConverter.deserialize(DefaultConverters.java:282)

at com.owlike.genson.convert.DefaultConverters$StringConverter.deserialize(DefaultConverters.java:269)

at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:57)

at com.owlike.genson.Genson.deserialize(Genson.java:440)

... 39 more

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值