- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Jersey (jaxrs-ri-2.7)、Tomcat 7.0.47 和 Java 1.7.0_51。由于防火墙的原因,我无法使用 Maven。我的目标是做一个 JSON RESTful Web 服务。尽管我被告知 MOXy 包含在 Jersey 版本中,但我无法让 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
顺便说一句,如果只有一个库可以开箱即用地使用注释实际处理 JSON Web 服务,Java 开发人员会喜欢它吗?刚刚起作用的一个?
最佳答案
为什么要为 Genson 编写 MessageBodyWriter? Genson 有它自己的,当你的类路径中有 Genson 时,应该自动选择它。
如果不是这种情况,我猜 Jersey 找到了另一个 JSON 提供者(也许是 moxy),因此不会选择 Genson。如果是这种情况,您可以尝试在类路径中创建一个文件夹 META-INF/services 并将 Genson 定义为您的提供程序(这应该覆盖其他提供程序)。你可以看看Genson是怎么做的here .
您还应该采用 Genson 的最新版本 0.99,它有一些改进,例如 JSR 353 的实现,它试图为 Java 中的 JSON 解析(而不是数据绑定(bind))提供“标准”。
关于java - 如何告诉 Jersey 我的 MessageBodyWriter 在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23248121/
假设我在 JAX-RS 1 环境(带有 Jackson 提供程序的 RestEasy 2)中有一个数据类,如下所示: class Foo { int id; String name;
我正在尝试在 JBoss 7.2 Rest Easy 中计算出 JAX-RS 示例。我收到如下错误消息。 SEVERE [org.jboss.resteasy.core.SynchronousDisp
我正在尝试从后端(spring)发送一些混合数据到后端(jersey)要发送的数据是混合的:对象、文件。我不断收到此错误: javax.ws.rs.ProcessingException: No av
我想创建rest api。我不想在每个资源类中重复使用绝对路径,所以我想使其分层。所以而不是像这样: @Path("/") @Component @Scope("request") public cl
我想创建一个 Jersey 提供程序 ( MessageBodyWriter ),它更新 dto 对象属性并继续链接到 Jersey-json 默认提供程序并返回 json 对象。 问题是,看起来默认
在 Dropwizard Web 服务中,我想使用以下自定义 MessageBodyWriter 返回数据库中 Test 类的对象。 @Provider @Produces("applicatio
本质上,我有一个将对象写入 JSON 的 MessageBodyWriter,并且我希望能够根据处理请求的资源方法来控制输出的某些方面。但是,@Provider 类的默认生命周期是单例(每个 JVM
我正在使用 Jetty 制作一个小型 RESTful 服务。使用 Maven 作为构建工具。 当我尝试调用试图访问对象的 JSON 表示的 GET 方法时,我收到“MessageBodyWriter”
我正在尝试在我的自定义 MessageBodyWriter 中获取 HttpServletRequest 的实例。我目前正在使用一个用@Context 注释的成员变量。但是,当请求首次使用编写器时 -
我有一个 REST 服务的返回类型,其中包含一个 Long 字段。当该字段为 NULL 时,返回的 XML 会跳过该字段。我希望该字段作为空元素出现在输出中。 例如:如果 POJO 定义如下: cla
我正在尝试重新创建最优秀的 vogella 教程,以使用 java、JAX-RS 和 Jersey 创建 REST。 我正在使用具有 Java-EE 视角的 eclipse Kepler,tomcat
我目前正在学习 REST,并且在调用方法时遇到错误。我确信这一定是一个简单的配置设置,但由于我对学习 REST 完全陌生,所以无法弄清楚。 web.xml Jersey
我正在使用 Jersey 编写 JAX_RS 应用程序。所有以 JSON 形式返回单个对象的端点在 Tomcat 和 WildFly 中都可以正常工作。 一个返回对象集合的端点在 Tomcat 中工作
Jersey 2.21. 我有如下资源文件 …… @POST @Path("/userReg") @Produces("application/json;charset=UTF-8") public
我想根据请求的 HttpHeader 以两种格式生成 REST API 响应: @Context HttpHeaders headers; public Response toResponse(MyV
我刚刚关注了this tutorial to create a REST API using Jersey on Jetty我喜欢这个结果。一切正常。但如果我运行 Gradle shadowJar生成
我正在使用 Jersey (jaxrs-ri-2.7)、Tomcat 7.0.47 和 Java 1.7.0_51。由于防火墙的原因,我无法使用 Maven。我的目标是做一个 JSON RESTful
如果发生错误(https://jersey.java.net/documentation/latest/representations.html#d0e3586),我正在尝试按照 Jersey 文档启
如何在 Jersey 的 MessageBodyWriter 中更改 HTTP 状态?我知道我可以在 writeTo 方法中通过 httpHeaders 和 entityStream 更改 heade
我已经尝试了所有方法...无法弄清楚为什么会出现此异常。有趣的是,在我的 IDE (Intellij) 中一切正常。想不通。。。放弃了。 你们有什么建议吗? dependencies { co
我是一名优秀的程序员,十分优秀!