我正在使用Jersey(jaxrs-ri-2.7),Tomcat 7.0.47和Java 1.7.0_51。由于防火墙,我无法使用Maven。我的目标是做一个JSON RESTful Web服务。我不能让MOXy工作,虽然我被告知它包含在泽西版本中。有一次,我可以让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
作为旁注,Java开发人员会喜欢它,如果只有一个库实际上是使用注释来处理JSON Web服务,开箱即用。一个刚刚起作用的?
答案 0 :(得分:1)
你为什么要为Genson写一个MessageBodyWriter? Genson有自己的,当你在类路径中有Genson时应该自动选择。
如果不是这种情况,我猜泽西岛找到了另一个JSON提供者(也许是moxy),因此不会选择Genson。如果是这种情况,您可以尝试在类路径中创建文件夹META-INF / services,并将Genson定义为您的提供者(这应该覆盖其他提供者)。您可以在Genson here中了解它是如何完成的。
另外你应该采用最新版本的Genson,0.99,它有一些改进,例如JSR 353的实现,试图提供一个&#34;标准&#34;用于Java中的JSON解析(不是数据绑定)。