- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开发一个 Android 应用程序,它使用 Resteasy-mobile 实现 REST(JAXRS),并使用 Jackson 进行 JSON 序列化。后者由 Resteasy 在后台完成。
服务器端我有一个 Jersey 网络服务,也使用 jackson 序列化到 JSON 或从 JSON 序列化。
Resteasy 客户端和 web 资源都实现了一个 JAXRS 注释接口(interface),如下所示:
@Path("/equipment")
@Consumes({"application/json"})
@Produces({"application/json"})
public interface AndroidEquipmentResourceIF
{
@GET
public Model getModel();
@GET
@Path("/version")
public String getVersion();
@GET
@Path("/{eId}")
public List<Equipment> getEquipmentListWithId(@PathParam("eId") String eId);
}
客户端,这个接口(interface)被加载到一个工厂中,并返回一个带有这个接口(interface)的对象,在调用方法时处理HTTP/URL/序列化过程。
当调用具有无效 ID 的设备实体时,如果未找到该实体,服务器将抛出 WebApplicationException
。客户端,这可能导致该方法返回 null。
如果我想对状态码做些什么,比如 404 - Not found
或 401 - Unauthorized
,我可能需要响应对象吧?我认为 Resteasy 和 Jersey 确实在后台使用 Response 对象,那么有没有办法通过 Resteasy 访问 Response 对象或状态代码?
EDIT1:忘记提及第二个选项。我注意到可以将对象包装在响应对象中。因此,如果我将所有特定域对象返回类型替换为 Response,并以某种方式将对象包装在响应中,我可以从 Response 对象中提取对象吗?这对我来说听起来不太干净,只是为了能够看到状态代码。另外,我想尽可能避免手动解析 JSON。
EDIT2:发现可以拦截 WebApplicationException
,Resteasy 客户端抛出 ClientResponseFailure 异常,可以在拦截器中捕获。问题是,永远不会抛出异常?它看起来像是在某个地方陷入了无限循环。
我收到以下异常:
10-26 10:52:10.048: E/AndroidRuntime(282): Caused by: java.lang.StackOverflowError
10-26 10:52:10.048: E/AndroidRuntime(282): at java.util.regex.Matcher.reset(Matcher.java:151)
10-26 10:52:10.048: E/AndroidRuntime(282): at java.util.regex.Matcher.reset(Matcher.java:211)
10-26 10:52:10.048: E/AndroidRuntime(282): at java.util.regex.Matcher.<init>(Matcher.java:127)
10-26 10:52:10.048: E/AndroidRuntime(282): at java.util.regex.Pattern.split(Pattern.java:405)
10-26 10:52:10.048: E/AndroidRuntime(282): at java.util.regex.Pattern.split(Pattern.java:355)
10-26 10:52:10.048: E/AndroidRuntime(282): at java.lang.String.split(String.java:2125)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.plugins.delegates.MediaTypeHeaderDelegate.parse(MediaTypeHeaderDelegate.java:33)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.plugins.delegates.MediaTypeHeaderDelegate.fromString(MediaTypeHeaderDelegate.java:18)
10-26 10:52:10.048: E/AndroidRuntime(282): at javax.ws.rs.core.MediaType.valueOf(MediaType.java:173)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.getMediaType(BaseClientResponse.java:362)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:346)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:319)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:442)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.copyFromError(BaseClientResponse.java:94)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.ClientResponseFailure.<init>(ClientResponseFailure.java:32)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:488)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:479)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.readFrom(BaseClientResponse.java:384)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:346)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:319)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:442)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.copyFromError(BaseClientResponse.java:94)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.ClientResponseFailure.<init>(ClientResponseFailure.java:32)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:488)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:479)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.readFrom(BaseClientResponse.java:384)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:346)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:319)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:442)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.core.BaseClientResponse.copyFromError(BaseClientResponse.java:94)
10-26 10:52:10.048: E/AndroidRuntime(282): at org.jboss.resteasy.client.ClientResponseFailure.<init>(ClientResponseFailure.java:32)
最佳答案
得到它的工作方式如下:
Resteasy-mobile 是 JBOSS Resteasy 2.2.1 GA 的精简版。为了让它在 Android 上运行,已经删除了很多东西。但是删除了太多。
我发现,如果抛出 ClientResponseFailure
,Response 的实体将被转换为 Byte
数组,并将再次读取以复制到 客户端响应失败
。问题是,修剪后的版本只包含字符串和文本/纯文本的消息体读取器/写入器,而不包含字节数组。因此,当尝试读取实体时,它会尝试抛出新的 ClientResponseFailure
,因为无法找到与 Byte[]
兼容的 MessageBodyReader
>。然后它再次将该实体转换为字节数组,尝试再次读取它,从而进入一个无限循环,该循环将以 StackOverflowError
结束。
通过将未修剪版本的 Resteasy 中缺少的 ByteArrayProvider
和 ReadFromStream
类添加到类路径(位于 org.jboss.resteasy.plugins.providers. ByteArrayProvider
和 org.jboss.resteasy.util.ReadFromStream
),ClientErrorInterceptor
(link)就像一个魅力!
编辑:我说得太快了,还没有发挥出魅力。ResteasyProviderFactory 也进行了修改以使其在 Android 中工作。 .getInstance() 方法不断返回一个新实例,因此如果您使用以下方法注册 ClientErrorInterceptor:ResteasyProviderFactory.getInstance().addClientErrorInterceptor(new DataExceptionInterceptor());
它不起作用。 ProxyFactory 将在内部使用 ResteasyProviderFactory 的新实例。
要解决此问题,应将用于添加拦截器的 ResteasyProviderFactory 传递给 ProxyFactory.create()
。
像这样:
ResteasyProviderFactory pf;
BasicHttpParams params;
pf = ResteasyProviderFactory.getInstance();
pf.addClientErrorInterceptor(new DataExceptionInterceptor());
params = new BasicHttpParams();
HttpProtocolParams.setVersion(params,
HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params,
HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params,
false);
return ProxyFactory.create(AndroidEquipmentResourceIF.class,
ProxyFactory.createUri(requestURI),
new ThreadSafeApacheHttpClient4Executor(params),
pf);
关于java - 为什么 Resteasy-mobile 中的 ClientResponseFailure 会导致 StackOverflowError?解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13083214/
是否可以为所有意外错误创建全局异常处理程序。 因为不可能像这样制作所有可能的类: public class ExceptionHandler implements ExceptionMapper {.
我正在尝试同时运行 HTTPServer 和 REST 处理程序。一次只能工作一个,不能同时工作。我需要提供 html 页面和 api。 这是我的代码。 public class HttpSe
JBoss 告诉我们 http://docs.jboss.org/seam/3/rest/latest/reference/en-US/html/rest.client.html 要为 RestEAS
我们使用的是 Wildfly 10.1.0 和 Resteasy 3.1.1。在数百 rps 的吞吐量下,即使平均延迟非常低,我们也会看到随机的长请求。 我们正在查看 New Relic 在我们的应用
我有以下代码: var threadsWaiter = new CountDownLatch(customers.size()); for(var c: List customers) { se
考虑以下场景(使用 Rest easy 进行 Rest 实现): 客户端向我的 RestService 发送了请求。 我的休息服务更新了与请求相关的数据库。 最后我的休息服务发送了一些响应。 如果客户
我们在这里运行 RESTEasy 2.3.0.GA,我正在为 https://stackoverflow.com/questions/18219237/jax-rs-path-regex-fails-
我使用 JBoss (AS 7.1)、RestEasy 和 Jackson 开发 REST Api。 Web 服务返回一个“Account”对象,它是一个简单的 POJO,过去在 JSon 中序列化没
我需要使用 RESTEasy 设计 RESTful 服务。客户端可以使用任意数量的查询参数来调用此公共(public)服务。我的 REST 代码应该能够以某种方式读取这些查询参数。例如,如果我有图书搜
我需要创建 rest-easy 客户端,使用其他人创建的 RestService 的 de 接口(interface)...这很好,除了一件事...... 当我从 rest-easy 2.3.5.Fi
我在 resteasy-reactive 项目时收到消息。 (build-70) [io.quarkus.resteasy.common.deployment.ResteasyCommonProces
我写了一个我想测试的 Rest-Service。我想在不运行服务器的情况下运行 JUnit 测试。为此,我使用了 RestEasy 的服务器端模拟框架。 我的问题是,如何使用此框架在 Http-Bod
我正在开发 Resteasy。我将应用程序的 Maven 依赖项从 2.2.x 迁移到 3.0.x,突然间我发现大部分 API 都已弃用。所以这个迁移对我的代码和测试用例有影响,因为它在我的整个代码中
我在使用 RESTEASY 的休息应用程序上需要 CDI 功能。所以我跟着manual's instruction在我的应用程序上设置 resteasy-cdi 模块,它在 JBoss AS7 上运行
我将一个项目从 JBOSS 迁移到 Wildfly Server。我在 standalone.xml 中做了一些更改,一切正常,但是当我从 Postman 发送 JSON 请求时,出现以下异常: ER
我有一个使用restEasy编写的restful服务并部署到JBoss。我有一个 web.xml 被玷污为: Web Application org.restea
我有一个简单的 Hello World 示例 JAX-RS 项目。真的很简单也很愚蠢。只是最小的配置,我打算在未来增强,想象一下这样的事情:https://robferguson.org/blog/2
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我编写了一些异常映射器来捕获和处理内置的简单异常,如 NotFoundException、MethodNotAllowedException 等,示例代码如下所示: @Provider public
嗨,我正在尝试使用多部分表单上传多个文件 我使用这个,但我得到错误的请求状态,我如何上传多个文件? public class AttachmentBody { @FormParam("file
我是一名优秀的程序员,十分优秀!