Java 泽西不';不能与给定的提供者一起工作

Java 泽西不';不能与给定的提供者一起工作,java,jersey,gson,Java,Jersey,Gson,我正在与泽西公司合作,并尝试使用Gson提供商而不是Jackson。我用了我的博客 我定义的REST服务: @路径(“用户”) 它返回:Response:null 当我明确使用Gson提供程序时: @Path("user") public class UserResource extends AbstractResource { @POST @Path("auth") @Consumes(MediaType.APPLICATION_JSON) public St

我正在与泽西公司合作,并尝试使用Gson提供商而不是Jackson。我用了我的博客

我定义的REST服务: @路径(“用户”)

它返回:Response:null

当我明确使用Gson提供程序时:

@Path("user")
public class UserResource extends AbstractResource {

    @POST
    @Path("auth")
    @Consumes(MediaType.APPLICATION_JSON)
    public String postAuth(String json) {
        Login obj = new Gson().fromJson(json, Login.class);
        return "Response: " + obj;
    }
}
它返回:响应:用户名密码

我在Grizzly明确注册了提供商:

rc.register(GsonProvider.class);
提供程序的以下代码:

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
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;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

@Provider
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public final class GsonProvider implements MessageBodyWriter<Object>,
        MessageBodyReader<Object> {

    private static final String UTF_8 = "UTF-8";

    private Gson gson;

    private Gson getGson() {
        System.out.println("ja");

        if (gson == null) {
            final GsonBuilder gsonBuilder = new GsonBuilder();
            gson = gsonBuilder.create();
        }
        return gson;
    }

    @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 {
            Type jsonType;
            if (type.equals(genericType)) {
                jsonType = type;
            } else {
                jsonType = genericType;
            }
            return getGson().fromJson(streamReader, jsonType);
        } finally {
            streamReader.close();
        }
    }

    @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 {
            Type jsonType;
            if (type.equals(genericType)) {
                jsonType = type;
            } else {
                jsonType = genericType;
            }
            getGson().toJson(object, jsonType, writer);
        } finally {
            writer.close();
        }
    }
}
import java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.OutputStream;
导入java.io.OutputStreamWriter;
导入java.io.UnsupportedEncodingException;
导入java.lang.annotation.annotation;
导入java.lang.reflect.Type;
导入javax.ws.rs.Consumes;
导入javax.ws.rs.products;
导入javax.ws.rs.WebApplicationException;
导入javax.ws.rs.core.MediaType;
导入javax.ws.rs.core.MultivaluedMap;
导入javax.ws.rs.ext.MessageBodyReader;
导入javax.ws.rs.ext.MessageBodyWriter;
导入javax.ws.rs.ext.Provider;
导入com.google.gson.gson;
导入com.google.gson.GsonBuilder;
@提供者
@产生(MediaType.APPLICATION_JSON)
@使用(MediaType.APPLICATION_JSON)
公共最终类GsonProvider实现MessageBodyWriter,
MessageBodyReader{
私有静态最终字符串UTF_8=“UTF-8”;
私人Gson;
私有Gson getGson(){
系统输出打印项次(“ja”);
if(gson==null){
最终GsonBuilder GsonBuilder=新的GsonBuilder();
gson=gsonBuilder.create();
}
返回gson;
}
@凌驾
公共布尔值可读取(类类型、类型genericType、,
java.lang.annotation.annotation[]注释,MediaType(MediaType){
返回true;
}
@凌驾
公共对象读取自(类类型、类型genericType、,
注释[]注释,MediaType MediaType,
多值映射HttpHeader,InputStream entityStream)
抛出IOException{
InputStreamReader streamReader=新的InputStreamReader(entityStream,
UTF_8);
试一试{
类型jsonType;
if(type.equals(genericType)){
jsonType=type;
}否则{
jsonType=genericType;
}
返回getGson().fromJson(streamReader,jsonType);
}最后{
streamReader.close();
}
}
@凌驾
公共布尔值可写(类类型、类型genericType、,
注释[]注释,MediaType(MediaType){
返回true;
}
@凌驾
公共长getSize(对象、类类型、类型genericType、,
注释[]注释,MediaType(MediaType){
返回-1;
}
@凌驾
public void writeTo(对象、类类型、类型genericType、,
注释[]注释,MediaType MediaType,
多值MAP HttpHeader,
OutputStream entityStream)引发IOException,
WebApplicationException{
OutputStreamWriter writer=新的OutputStreamWriter(entityStream,UTF_8);
试一试{
类型jsonType;
if(type.equals(genericType)){
jsonType=type;
}否则{
jsonType=genericType;
}
getGson().toJson(对象,jsonType,writer);
}最后{
writer.close();
}
}
}

我在github中添加了一个案例(使用Gson而不是Jackson)

您可以在那里找到GsonUtil+的一个实现—一个完整的示例:


希望它能对您有所帮助-您还会看到一个web.xml示例,用于配置整个提供者。

您的应用程序中是否注册了其他提供者?您是否在stout中看到任何输出(来自#getGson())?正如@MichalGajdos所提到的,可能是另一个提供者正在获取application/json。如果您将Jersey的日志设置为FINEST,它将在启动时告诉您哪些提供商已注册。也许可以尝试将GsonProvider从“implements MessageBodyReader”更改为“implements MessageBodyReader”。感谢指针的帮助,我发现Moxy也是由Maven加载的。泽西选择了莫西而不是格森。尽管如此,还是要感谢大家的帮助!
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
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;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

@Provider
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public final class GsonProvider implements MessageBodyWriter<Object>,
        MessageBodyReader<Object> {

    private static final String UTF_8 = "UTF-8";

    private Gson gson;

    private Gson getGson() {
        System.out.println("ja");

        if (gson == null) {
            final GsonBuilder gsonBuilder = new GsonBuilder();
            gson = gsonBuilder.create();
        }
        return gson;
    }

    @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 {
            Type jsonType;
            if (type.equals(genericType)) {
                jsonType = type;
            } else {
                jsonType = genericType;
            }
            return getGson().fromJson(streamReader, jsonType);
        } finally {
            streamReader.close();
        }
    }

    @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 {
            Type jsonType;
            if (type.equals(genericType)) {
                jsonType = type;
            } else {
                jsonType = genericType;
            }
            getGson().toJson(object, jsonType, writer);
        } finally {
            writer.close();
        }
    }
}