@Test public void clientSideResolverResolvesServerSideErrors() throws Exception { ErrorResolver server = new PojoErrorResolver(mapper); ExceptionResolver client = new PojoExceptionResolver(mapper); PojoTestException originalException = new PojoTestException("alpha", "beta"); JsonError originalError = server.resolveError( originalException, PojoService.class.getMethod("pojoCall", String.class), Collections.emptyList()); ObjectNode response = wrapErrorAsResponse(originalError); Throwable deserializedThrowable = client.resolveException(response); assertThat(deserializedThrowable) .isInstanceOf(PojoTestException.class) .isEqualToComparingFieldByField(originalException); }
/** * {@inheritDoc} */ public Throwable resolveException(ObjectNode response) { for (ExceptionResolver resolver : resolvers) { Throwable resolvedException = resolver.resolveException(response); if (resolvedException != null) { return resolvedException; } } return null; }
protected void handleErrorResponse(ObjectNode jsonObject) throws Throwable { if (hasError(jsonObject)) { // resolve and throw the exception if (exceptionResolver == null) { throw DefaultExceptionResolver.INSTANCE.resolveException(jsonObject); } else { throw exceptionResolver.resolveException(jsonObject); } } }
/** * Reads a JSON-PRC response from the server. This blocks until a response * is received. * * @param returnType the expected return type * @param ips the {@link InputStream} to read from * @return the object returned by the JSON-RPC response * @throws Throwable on error */ private <T> T readResponse(Type returnType, InputStream ips) throws Throwable { JsonNode response = mapper.readTree(new NoCloseInputStream(ips)); logger.debug("JSON-PRC Response: {}", response); if (!response.isObject()) { throw new JsonRpcClientException(0, "Invalid JSON-RPC response", response); } ObjectNode jsonObject = ObjectNode.class.cast(response); if (jsonObject.has(ERROR) && jsonObject.get(ERROR) != null && !jsonObject.get(ERROR).isNull()) { throw exceptionResolver.resolveException(jsonObject); } if (jsonObject.has(RESULT) && !jsonObject.get(RESULT).isNull() && jsonObject.get(RESULT) != null) { JsonParser returnJsonParser = mapper.treeAsTokens(jsonObject.get(RESULT)); JavaType returnJavaType = mapper.getTypeFactory().constructType(returnType); return mapper.readValue(returnJsonParser, returnJavaType); } return null; }