From f14ef05c88fbc982100699bc0b772064db499972 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Thu, 14 Dec 2017 15:02:16 +0800 Subject: [PATCH] =?UTF-8?q?HttpResponse=E5=A2=9E=E5=8A=A0finish(Object)?= =?UTF-8?q?=E7=B3=BB=E5=88=97=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/net/http/HttpResponse.java | 138 ++++++++++--------- src/org/redkale/net/http/Rest.java | 47 +------ test/org/redkale/test/rest/HelloService.java | 5 + 3 files changed, 79 insertions(+), 111 deletions(-) diff --git a/src/org/redkale/net/http/HttpResponse.java b/src/org/redkale/net/http/HttpResponse.java index 7f7ffecb9..ce1a2b06d 100644 --- a/src/org/redkale/net/http/HttpResponse.java +++ b/src/org/redkale/net/http/HttpResponse.java @@ -16,7 +16,7 @@ import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; -import org.redkale.convert.Convert; +import org.redkale.convert.*; import org.redkale.convert.json.JsonConvert; import org.redkale.net.*; import org.redkale.util.AnyValue.DefaultAnyValue; @@ -248,7 +248,7 @@ public class HttpResponse extends Response { * @param 泛型 * @param handlerClass CompletionHandler子类 * - * @return CompletionHandler + * @return CompletionHandler */ @SuppressWarnings("unchecked") public H createAsyncHandler(Class handlerClass) { @@ -377,7 +377,7 @@ public class HttpResponse extends Response { * @param future 输出对象的句柄 */ public void finishJson(final CompletableFuture future) { - finishJson(request.getJsonConvert(), future); + finish(request.getJsonConvert(), (Type) null, future); } /** @@ -388,20 +388,7 @@ public class HttpResponse extends Response { */ @SuppressWarnings("unchecked") public void finishJson(final JsonConvert convert, final CompletableFuture future) { - future.whenComplete((v, e) -> { - if (e != null) { - context.getLogger().log(Level.WARNING, "Servlet occur, forece to close channel. request = " + request, e); - finish(500, null); - return; - } - if (v instanceof CharSequence) { - finish(v.toString()); - } else if (v instanceof org.redkale.service.RetResult) { - finishJson(convert, (org.redkale.service.RetResult) v); - } else { - finishJson(convert, v); - } - }); + finish(convert, (Type) null, future); } /** @@ -413,67 +400,84 @@ public class HttpResponse extends Response { */ @SuppressWarnings("unchecked") public void finishJson(final JsonConvert convert, final Type type, final CompletableFuture future) { - future.whenComplete((v, e) -> { - if (e != null) { - context.getLogger().log(Level.WARNING, "Servlet occur, forece to close channel. request = " + request, e); - finish(500, null); - return; - } - if (v instanceof CharSequence) { - finish(v.toString()); - } else if (v instanceof HttpResult) { - finish(convert, (HttpResult) v); - } else if (v instanceof org.redkale.service.RetResult) { - finishJson(convert, (org.redkale.service.RetResult) v); - } else { - finishJson(convert, type, v); - } - }); + finish(convert, type, future); } /** - * 将HttpResult的结果对象输出 + * 将结果对象输出 * - * @param result HttpResult对象 - */ - public void finish(final HttpResult result) { - finish(request.getJsonConvert(), result); - } - - /** - * 将HttpResult的结果对象输出
- * 当result不为byte[]/String/ByteBuffer/ByteBuffer[]类型时按Convert 形式输出 - * - * @param convert 指定的Convert - * @param result HttpResult对象 + * @param obj 输出对象 */ @SuppressWarnings("unchecked") - public void finish(final Convert convert, final HttpResult result) { - if (result == null) { - finish(""); - return; - } - if (result.getContentType() != null) setContentType(result.getContentType()); - addHeader(result.getHeaders()).addCookie(result.getCookies()).setStatus(result.getStatus() < 1 ? 200 : result.getStatus()); - if (result.getResult() instanceof File) { + public void finish(final Object obj) { + finish(request.getJsonConvert(), (Type) null, obj); + } + + /** + * 将结果对象输出 + * + * @param convert 指定的Convert + * @param obj 输出对象 + */ + @SuppressWarnings("unchecked") + public void finish(final Convert convert, final Object obj) { + finish(convert, (Type) null, obj); + } + + /** + * 将结果对象输出 + * + * @param convert 指定的Convert + * @param type 指定的类型 + * @param obj 输出对象 + */ + @SuppressWarnings("unchecked") + public void finish(final Convert convert, final Type type, final Object obj) { + if (obj instanceof CompletableFuture) { + ((CompletableFuture) obj).whenComplete((v, e) -> { + if (e != null) { + context.getLogger().log(Level.WARNING, "Servlet occur, forece to close channel. request = " + request, e); + finish(500, null); + return; + } + finish(convert, type, v); + }); + } else if (obj instanceof CharSequence) { + finish((String) obj.toString()); + } else if (obj instanceof byte[]) { + finish((byte[]) obj); + } else if (obj instanceof ByteBuffer) { + finish((ByteBuffer) obj); + } else if (obj instanceof ByteBuffer[]) { + finish((ByteBuffer[]) obj); + } else if (obj instanceof File) { try { - finish((File) result.getResult()); + finish((File) obj); } catch (IOException e) { - getContext().getLogger().log(Level.WARNING, "HttpServlet finish HttpResult File occur, forece to close channel. request = " + getRequest(), e); + getContext().getLogger().log(Level.WARNING, "HttpServlet finish File occur, forece to close channel. request = " + getRequest(), e); finish(500, null); } - } else if (result.getResult() instanceof byte[]) { - finish((byte[]) result.getResult()); - } else if (result.getResult() instanceof ByteBuffer) { - finish((ByteBuffer) result.getResult()); - } else if (result.getResult() instanceof ByteBuffer[]) { - finish((ByteBuffer[]) result.getResult()); - } else if (result.getResult() instanceof String) { - finish((String) result.getResult()); - } else if (result.getResult() == null) { - finish(result.getMessage()); + } else if (obj instanceof HttpResult) { + HttpResult result = (HttpResult) obj; + if (result.getContentType() != null) setContentType(result.getContentType()); + addHeader(result.getHeaders()).addCookie(result.getCookies()).setStatus(result.getStatus() < 1 ? 200 : result.getStatus()); + if (result.getResult() == null) { + finish(""); + } else { + finish(convert, result.getResult()); + } } else { - finishJson(result.getResult()); + if (convert instanceof TextConvert) this.contentType = "text/plain; charset=utf-8"; + if (this.recycleListener != null) this.output = obj; + if (obj instanceof org.redkale.service.RetResult) { + org.redkale.service.RetResult ret = (org.redkale.service.RetResult) obj; + if (!ret.isSuccess()) { + this.header.addValue("retcode", String.valueOf(ret.getRetcode())).addValue("retinfo", ret.getRetinfo()); + } + } + ByteBuffer[] buffers = type == null ? convert.convertTo(context.getBufferSupplier(), obj) + : convert.convertTo(context.getBufferSupplier(), type, obj); + finish(buffers); } } diff --git a/src/org/redkale/net/http/Rest.java b/src/org/redkale/net/http/Rest.java index d326599ba..13d339b71 100644 --- a/src/org/redkale/net/http/Rest.java +++ b/src/org/redkale/net/http/Rest.java @@ -588,6 +588,7 @@ public final class Rest { final String reqDesc = Type.getDescriptor(HttpRequest.class); final String respDesc = Type.getDescriptor(HttpResponse.class); final String convertDesc = Type.getDescriptor(Convert.class); + final String typeDesc = Type.getDescriptor(java.lang.reflect.Type.class); final String jsonConvertDesc = Type.getDescriptor(JsonConvert.class); final String retDesc = Type.getDescriptor(RetResult.class); final String futureDesc = Type.getDescriptor(CompletableFuture.class); @@ -1546,34 +1547,6 @@ public final class Rest { mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finish", "(Ljava/io/File;)V", false); mv.visitInsn(RETURN); maxLocals++; - } else if (RetResult.class.isAssignableFrom(returnType)) { - mv.visitVarInsn(ASTORE, maxLocals); - mv.visitVarInsn(ALOAD, 2); //response - if (rcs != null && rcs.length > 0) { - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, REST_JSONCONVERT_FIELD_PREFIX + restConverts.size(), jsonConvertDesc); - mv.visitVarInsn(ALOAD, maxLocals); - mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finishJson", "(" + jsonConvertDesc + retDesc + ")V", false); - } else { - mv.visitVarInsn(ALOAD, maxLocals); - mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finishJson", "(" + retDesc + ")V", false); - } - mv.visitInsn(RETURN); - maxLocals++; - } else if (HttpResult.class.isAssignableFrom(returnType)) { - mv.visitVarInsn(ASTORE, maxLocals); - mv.visitVarInsn(ALOAD, 2); //response - if (rcs != null && rcs.length > 0) { - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, REST_JSONCONVERT_FIELD_PREFIX + restConverts.size(), jsonConvertDesc); - mv.visitVarInsn(ALOAD, maxLocals); - mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finish", "(" + convertDesc + httprsDesc + ")V", false); - } else { - mv.visitVarInsn(ALOAD, maxLocals); - mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finish", "(" + httprsDesc + ")V", false); - } - mv.visitInsn(RETURN); - maxLocals++; } else if (Number.class.isAssignableFrom(returnType) || CharSequence.class.isAssignableFrom(returnType)) { //returnType == String.class 必须放在前面 mv.visitVarInsn(ASTORE, maxLocals); mv.visitVarInsn(ALOAD, 2); //response @@ -1582,20 +1555,6 @@ public final class Rest { mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finish", "(Ljava/lang/String;)V", false); mv.visitInsn(RETURN); maxLocals++; - } else if (CompletableFuture.class.isAssignableFrom(returnType)) { - mv.visitVarInsn(ASTORE, maxLocals); - mv.visitVarInsn(ALOAD, 2);//response - if (rcs != null && rcs.length > 0) { - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, REST_JSONCONVERT_FIELD_PREFIX + restConverts.size(), jsonConvertDesc); - mv.visitVarInsn(ALOAD, maxLocals); - mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finishJson", "(" + jsonConvertDesc + futureDesc + ")V", false); - } else { - mv.visitVarInsn(ALOAD, maxLocals); - mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finishJson", "(" + futureDesc + ")V", false); - } - mv.visitInsn(RETURN); - maxLocals++; } else { mv.visitVarInsn(ASTORE, maxLocals); mv.visitVarInsn(ALOAD, 2); //response @@ -1603,10 +1562,10 @@ public final class Rest { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, newDynName, REST_JSONCONVERT_FIELD_PREFIX + restConverts.size(), jsonConvertDesc); mv.visitVarInsn(ALOAD, maxLocals); - mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finishJson", "(" + jsonConvertDesc + "Ljava/lang/Object;)V", false); + mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finish", "(" + convertDesc + typeDesc + "Ljava/lang/Object;)V", false); } else { mv.visitVarInsn(ALOAD, maxLocals); - mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finishJson", "(Ljava/lang/Object;)V", false); + mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "finish", "(Ljava/lang/Object;)V", false); } mv.visitInsn(RETURN); maxLocals++; diff --git a/test/org/redkale/test/rest/HelloService.java b/test/org/redkale/test/rest/HelloService.java index 6183bf4f3..c84daa060 100644 --- a/test/org/redkale/test/rest/HelloService.java +++ b/test/org/redkale/test/rest/HelloService.java @@ -43,6 +43,11 @@ public class HelloService implements Service { return new RetResult<>(entity); } + // + public HttpResult showHello(int id) { + return new HttpResult("a"); + } + //删除记录 public void deleteHello(int id) { //通过 /pipes/hello/delete/1234 删除对象 source.delete(HelloEntity.class, id);