ame*_*dro 24 java rest json web-services jax-rs
我试图通过JAX-RS Web服务发送JSON对象.我的文件web.xml是:
<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>it.notifire</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>JAX-RS Servlet</servlet-name>
<url-pattern>/jaxrs/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
模拟我要发送的对象的类是:
public class GPSCoordinate {
private float latitudine;
private float longitudine;
public float getLatitudine() {
return latitudine;
}
public void setLatitudine(float latitudine) {
this.latitudine = latitudine;
}
public float getLongitudine() {
return longitudine;
}
public void setLongitudine(float longitudine) {
this.longitudine = longitudine;
}
}
Run Code Online (Sandbox Code Playgroud)
根类资源是:
@Path("position")
public class Position {
@Context
private UriInfo context;
@GET
@Produces(MediaType.APPLICATION_JSON)
public GPSCoordinate getHTML() {
GPSCoordinate coord = new GPSCoordinate();
coord.setLatitudine(90.45f);
coord.setLongitudine(34.56f);
return coord;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试访问该服务时,我将浏览器指向以下链接
http://localhost:8080/Notifire/jaxrs/position
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
消息org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:找不到媒体类型= application/json的MessageBodyWriter
在我的WEB-INF/lib文件夹中,我有最后一个版本的jersey JAX-RS实现(jaxrs-ri-2.5.jar)和jersey-json.jar存档.
任何帮助将非常感激.
eug*_*gen 52
尝试将Genson添加到类路径中,它将自动启用JSON支持.
Genson是json和java/scala的数据绑定和流式库.它实现了JAX-RS的扩展点MessageBodyReader/Writer,允许jersey自动检测Genson并将其用于Json解析/写入.
你可以找到更多关于Gensons与JaxRS(jersey&cie)整合的信息.
Jersey支持'autodiscoverable'功能,JSON支持就是其中之一.根据文档,为了启用它,您需要在路径中添加兼容的库
但是,虽然由于jersey-media-json-processing某种原因我的案例中没有识别推荐的库,但是jersey-media-moxy:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.15</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
2.15是撰写本文时的最新版本.访问maven central artifact页面以查找当前版本.
这就是我解决问题的方法。
用过杰克逊。添加了这些罐子

将此类添加到我的项目中。代码的关键行被标记为“重要”。
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; <-- IMPORTANT
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
//@javax.ws.rs.ApplicationPath("webresources")
public class MyApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<Class<?>>();
//addRestResourceClasses(resources);
//resources.add(MultiPartFeature.class);
//resources.add(JettisonFeature.class);
return resources;
}
@Override
public Set<Object> getSingletons() {
final Set<Object> instances = new HashSet<Object>();
instances.add(new JacksonJsonProvider()); <--------- IMPORTANT
return instances;
}
/**
* Do not modify addRestResourceClasses() method.
* It is automatically populated with
* all resources defined in the project.
* If required, comment out calling this method in getClasses().
*/
private void addRestResourceClasses(Set<Class<?>> resources) {
//resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class);
//resources.add(org.glassfish.jersey.media.multipart.MultiPartProperties.Feature.MultiPartContextResolver.class);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
向客户端配置注册JacksonJsonProvier类,然后创建Client对象,这对我有用。下面是代码。
ClientConfig config = new ClientConfig();
config.register(JacksonJsonProvider.class);
Client client = ClientBuilder.newClient(config);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
55121 次 |
| 最近记录: |