繁体   English   中英

我如何告诉泽西岛我的MessageBodyWriter在哪里?

[英]How do I tell Jersey where my MessageBodyWriter is?

我正在使用Jersey(jaxrs-ri-2.7),Tomcat 7.0.47和Java 1.7.0_51。 由于有防火墙,所以我不能使用Maven。 我的目标是做一个JSON RESTful Web服务。 虽然有人告诉我MOXy包含在Jersey版本中,但我无法使用它。 一方面,我可以让Jersey返回XML。 当我通过浏览器调用Web服务时,得到的是:

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: 

MessageBodyWriter not found for media type=application/json, type=class com.pracht.test.Calculation, genericType=class com.pracht.test.Calculation.

    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:247)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:103)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:88)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1154)
    at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:571)
    at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:378)
    ...

这是我的提供程序类:

package com.pracht.test;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

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.MessageBodyWriter;
import javax.ws.rs.ext.Provider;

import com.owlike.genson.Genson;
import com.owlike.genson.TransformationException;

@Provider
@Produces("application/json")
public class JsonProvider implements MessageBodyWriter<Calculation> {

    public JsonProvider() throws IOException{
        try {
            PrintWriter pw=new PrintWriter(
                       new BufferedOutputStream(new  FileOutputStream("c:\\test.txt")));
            pw.println("Reached JsonProvider()");
            pw.close();
        } catch(IOException e){
            e.printStackTrace();
        }
    }

    @Override
    public long getSize(Calculation arg0, Class<?> arg1, Type arg2,
            Annotation[] arg3, MediaType arg4) {
        return 0;
    }

    @Override
    public void writeTo(Calculation calculation, 
            Class<?> type, 
            Type genericType,
            Annotation[] annotations, 
            MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders, 
            OutputStream entityStream)
            throws IOException, WebApplicationException {
        Genson genson = new Genson();
        try {
            String json=genson.serialize(calculation);
            entityStream.write(json.getBytes());
        } catch (TransformationException e) {
            e.printStackTrace();
            throw new WebApplicationException("Serialization error",e);
        }
    }

    @Override
    public boolean isWriteable(Class<?> classType, Type arg1, Annotation[] arg2,
            MediaType arg3) {
        return classType == Calculation.class;
    }


}

我在构造函数中添加了PrintWriter,以希望告诉我至少可以构造一个对象并将结果放在可以看到的位置。 我只是想快速了解一些内容,并且不想弄清楚正在使用什么日志记录API。

这是我的网络资源:

package com.pracht.test;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/calc")
public class CalcRest {


public CalcRest(){
    System.out.println("Reached CalcRest()");

}

@GET
@Path("/add/{a}/{b}")
@Produces("application/json")
public Calculation addPlainText(@PathParam("a") double a,
        @PathParam("b") double b) {
    System.out.println("Reached addPlainText()");
    return new Calculation().withProblem(a+"+"+b).withAnswer(a+b);
}

}

这是我使用Firefox拨打的电话:

http://localhost:8080/Contacts/rest/calc/add/1/2

附带说明一下,如果只有一个库可以实际使用批注来实际处理JSON Web服务,那么Java开发人员会喜欢吗? 一个刚刚起作用?

您为什么为Genson编写MessageBodyWriter? Genson有它自己的类,当您在类路径中有Genson时,应自动选择该类。

如果不是这种情况,我猜泽西(Jersey)找到了另一个JSON提供程序(也许是moxy),因此不选择Genson。 如果是这种情况,您可以尝试在类路径中创建一个文件夹META-INF / services并在其中定义Genson作为您的提供者(这应该覆盖其他提供者)。 您可以在这里查看 Genson的完成方式。

另外,您还应该使用Genson 0.99的最新版本,它有一些改进,例如JSR 353的实现,该实现试图为Java中的JSON解析(非数据绑定)提供“标准”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM