我有一个使用和生成JSON对象的RESTful服务,我希望Jersey使用Gson而不是Jackson。怎么能这样做...?
cbjzeqam1#
您需要编写MessageBodyReader和MessageBodyWriter的自定义实现(可能在同一个类中),并在Jersey注册(如果您使用包扫描,@Provider注解就足够了)-与JacksonJsonProvider非常相似:
MessageBodyReader
MessageBodyWriter
@Provider
JacksonJsonProvider
@Provider @Consumes({MediaType.APPLICATION_JSON, "text/json"}) @Produces({MediaType.APPLICATION_JSON, "text/json"}) class GsonJsonProvider implements MessageBodyReader<Object>, MessageBodyWriter<Object> { ...
rm5edbpk2#
你可以在这里找到一个完整的工作示例:https://github.com/DominikAngerer/java-GsonJerseyProvider将有一个http://eclipsesource.com/blogs/2012/11/02/integrating-gson-into-a-jax-rs-based-application/的工作实现,但有一些新的成就-像GsonUtil的Expose只的东西。
GsonUtil
Expose
import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import javax.ws.rs.Consumes; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.MessageBodyWriter; import javax.ws.rs.ext.Provider; @Provider @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public class GsonJerseyProvider implements MessageBodyWriter<Object>, MessageBodyReader<Object> { private static final String UTF_8 = "UTF-8"; @Override public boolean isReadable(Class<?> type, Type genericType, java.lang.annotation.Annotation[] annotations, MediaType mediaType) { return true; } @Override public Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException { InputStreamReader streamReader = new InputStreamReader(entityStream, UTF_8); try { return GsonUtil.getInstance().fromJson(streamReader, genericType); } catch (com.google.gson.JsonSyntaxException e) { // Log exception } finally { streamReader.close(); } return null; } @Override public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return true; } @Override public long getSize(Object object, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return -1; } @Override public void writeTo(Object object, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { OutputStreamWriter writer = new OutputStreamWriter(entityStream, UTF_8); try { GsonUtil.getInstance().toJson(object, genericType, writer); } finally { writer.close(); } } }
pxq42qpu3#
我很难让我的自定义Gson @Provider与GlassFish / Payara中嵌入的Jersey一起工作。在这种情况下,您必须将属性jersey.config.server.disableMoxyJson设置为true。例如:
jersey.config.server.disableMoxyJson
true
@ApplicationPath("/api") public class MyApplication extends Application { @Override public Map<String, Object> getProperties() { Map<String, Object> props = new HashMap<>(); props.put("jersey.config.server.disableMoxyJson", true); return props; } }
另见:
同样的事情也发生在一个新泽西客户身上:
new ClientConfig() .register(MyGsonProvider.class) .property("jersey.config.client.disableMoxyJson", true);
Payara 5支持JSON Binding API,所以继续使用Gson没有意义。我建议迁移到JSON-B。
jc3wubiy4#
你应该解决仅仅在你的pom中添加这个依赖
<dependency> <groupId>org.zalando.phrs</groupId> <artifactId>jersey-media-json-gson</artifactId> <version>0.1</version> </dependency>
在这里你可以找到repo的源代码:https://github.com/zalando/jersey-media-json-gson
fivyi3re5#
一个永恒之后...您可以使用真实的的依赖泽西岛媒体gson
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-gson</artifactId> <version>${jersey.version}</version> </dependency>
要注册的类是:
JsonGsonFeature.class
5条答案
按热度按时间cbjzeqam1#
您需要编写
MessageBodyReader
和MessageBodyWriter
的自定义实现(可能在同一个类中),并在Jersey注册(如果您使用包扫描,@Provider
注解就足够了)-与JacksonJsonProvider
非常相似:rm5edbpk2#
你可以在这里找到一个完整的工作示例:https://github.com/DominikAngerer/java-GsonJerseyProvider
将有一个http://eclipsesource.com/blogs/2012/11/02/integrating-gson-into-a-jax-rs-based-application/的工作实现,但有一些新的成就-像
GsonUtil
的Expose
只的东西。pxq42qpu3#
Payara 4
我很难让我的自定义Gson
@Provider
与GlassFish / Payara中嵌入的Jersey一起工作。在这种情况下,您必须将属性jersey.config.server.disableMoxyJson
设置为true
。例如:
另见:
同样的事情也发生在一个新泽西客户身上:
Payara 5
Payara 5支持JSON Binding API,所以继续使用Gson没有意义。我建议迁移到JSON-B。
jc3wubiy4#
你应该解决仅仅在你的pom中添加这个依赖
在这里你可以找到repo的源代码:https://github.com/zalando/jersey-media-json-gson
fivyi3re5#
一个永恒之后...
您可以使用真实的的依赖泽西岛媒体gson
要注册的类是: