/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.net.http;
import java.io.*;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.reflect.*;
import java.net.InetSocketAddress;
import java.nio.channels.CompletionHandler;
import java.util.*;
import java.util.concurrent.CompletionStage;
import org.redkale.annotation.*;
import org.redkale.annotation.Comment;
import org.redkale.asm.*;
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
import static org.redkale.asm.Opcodes.*;
import org.redkale.asm.Type;
import org.redkale.convert.*;
import org.redkale.convert.json.*;
import org.redkale.inject.ResourceFactory;
import org.redkale.mq.spi.MessageAgent;
import org.redkale.net.*;
import org.redkale.net.sncp.Sncp;
import org.redkale.service.*;
import org.redkale.source.Flipper;
import org.redkale.util.*;
import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader;
import static org.redkale.util.Utility.isEmpty;
/**
* 详情见: https://redkale.org
*
* @author zhangjx
*/
@SuppressWarnings("unchecked")
public final class Rest {
// 请求是否为rpc协议,值类型: 布尔,取值为true、false
public static final String REST_HEADER_RPC = "Rest-Rpc";
// traceid,值类型: 字符串
public static final String REST_HEADER_TRACEID = "Rest-Traceid";
// 当前用户ID值,值类型: 字符串
public static final String REST_HEADER_CURRUSERID = "Rest-Curruserid";
// 请求所需的RestService的资源名,值类型: 字符串
public static final String REST_HEADER_RESNAME = "Rest-Resname";
// 请求参数的反序列化种类,值类型: 字符串,取值为ConvertType枚举值名
public static final String REST_HEADER_REQ_CONVERT = "Rest-Req-Convert";
// 响应结果的序列化种类,值类型: 字符串,取值为ConvertType枚举值名
public static final String REST_HEADER_RESP_CONVERT = "Rest-Resp-Convert";
// ---------------------------------------------------------------------------------------------------
static final String REST_TOSTRINGOBJ_FIELD_NAME = "_redkale_toStringSupplier";
static final String REST_CONVERT_FIELD_PREFIX = "_redkale_restConvert_";
static final String REST_SERVICE_FIELD_NAME = "_redkale_service";
static final String REST_SERVICEMAP_FIELD_NAME =
"_redkale_serviceMap"; // 如果只有name=""的Service资源,则实例中_servicemap必须为null
private static final String REST_PARAMTYPES_FIELD_NAME =
"_redkale_paramTypes"; // 存在泛型的参数数组 Type[][] 第1维度是方法的下标, 第二维度是参数的下标
private static final String REST_RETURNTYPES_FIELD_NAME = "_redkale_returnTypes"; // 存在泛型的结果数组
private static final java.lang.reflect.Type TYPE_RETRESULT_STRING = new TypeToken<RetResult<String>>() {}.getType();
private static final Set<String> EXCLUDERMETHODS = new HashSet<>();
static {
for (Method m : Object.class.getMethods()) {
EXCLUDERMETHODS.add(m.getName());
}
}
/** 用于标记由Rest.createRestServlet 方法创建的RestServlet */
@Inherited
@Documented
@Target({TYPE})
@Retention(RUNTIME)
public static @interface RestDyn {
// 是否不需要解析HttpHeader,对应HttpContext.lazyHeaders
boolean simple() default false;
// 动态生成的类的子类需要关联一下,否则在运行过程中可能出现NoClassDefFoundError
Class[] types() default {};
}
/** 用于标记由Rest.createRestServlet 方法创建的RestServlet */
@Inherited
@Documented
@Target({TYPE})
@Retention(RUNTIME)
public static @interface RestDynSourceType {
Class value();
}
private Rest() {}
public static JsonFactory createJsonFactory(RestConvert[] converts, RestConvertCoder[] coders) {
return createJsonFactory(-1, converts, coders);
}
public static JsonFactory createJsonFactory(int features, RestConvert[] converts, RestConvertCoder[] coders) {
if (Utility.isEmpty(converts) && Utility.isEmpty(coders)) {
return JsonFactory.root();
}
final JsonFactory childFactory = JsonFactory.create();
if (features > -1) {
childFactory.withFeatures(features);
}
List<Class> types = new ArrayList<>();
Set<Class> reloadTypes = new HashSet<>();
if (coders != null) {
for (RestConvertCoder rcc : coders) {
reloadTypes.add(rcc.type());
childFactory.register(rcc.type(), rcc.field(), (SimpledCoder)
Creator.create(rcc.coder()).create());
}
}
if (converts != null) {
for (RestConvert rc : converts) {
if (rc.type() == void.class || rc.type() == Void.class) {
return JsonFactory.create().skipAllIgnore(true);
}
if (types.contains(rc.type())) {
throw new RestException("@RestConvert type(" + rc.type() + ") repeat");
}
if (rc.skipIgnore()) {
childFactory.registerSkipIgnore(rc.type());
childFactory.reloadCoder(rc.type());
} else if (rc.onlyColumns().length > 0) {
childFactory.registerIgnoreAll(rc.type(), rc.onlyColumns());
childFactory.reloadCoder(rc.type());
} else {
childFactory.register(rc.type(), false, rc.convertColumns());
childFactory.register(rc.type(), true, rc.ignoreColumns());
childFactory.reloadCoder(rc.type());
}
types.add(rc.type());
if (rc.features() > -1) {
childFactory.withFeatures(rc.features());
}
}
}
for (Class type : reloadTypes) {
childFactory.reloadCoder(type);
}
return childFactory;
}
static String getWebModuleNameLowerCase(Class<? extends Service> serviceType) {
final RestService controller = serviceType.getAnnotation(RestService.class);
if (controller == null) {
return serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase();
}
if (controller.ignore()) {
return null;
}
return (!controller.name().isEmpty())
? controller.name().trim()
: serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase();
}
static String getWebModuleName(Class<? extends Service> serviceType) {
final RestService controller = serviceType.getAnnotation(RestService.class);
if (controller == null) {
return serviceType.getSimpleName().replaceAll("Service.*$", "");
}
if (controller.ignore()) {
return null;
}
return (!controller.name().isEmpty())
? controller.name().trim()
: serviceType.getSimpleName().replaceAll("Service.*$", "");
}
/**
* 判断HttpServlet是否为Rest动态生成的
*
* @param servlet 检测的HttpServlet
* @return 是否是动态生成的RestHttpServlet
*/
public static boolean isRestDyn(HttpServlet servlet) {
return servlet.getClass().getAnnotation(RestDyn.class) != null;
}
/**
* 判断HttpServlet是否为Rest动态生成的,且simple, 不需要读取http-header的方法视为simple=true
*
* @param servlet 检测的HttpServlet
* @return 是否是动态生成的RestHttpServlet
*/
static boolean isSimpleRestDyn(HttpServlet servlet) {
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Redkale(红菜苔)是一款基于Java11全新架构的微服务开源框架设计源码。该框架采用Java、Shell和HTML等多种语言编写,项目包含610个文件,其中Java文件576个,XML文件8个,Shell脚本6个,属性文件6个,命令文件5个,文本文件4个,Git忽略文件1个,LICENSE文件1个,Markdown文件1个,以及README文件1个。
资源推荐
资源详情
资源评论
收起资源包目录
基于Java11全新架构的Redkale微服务开源框架设计源码 (826个子文件)
shutdown.cmd 211B
start.cmd 207B
apidoc.cmd 203B
redkale.cmd 199B
restart.cmd 178B
.gitignore 310B
apidoc-template.html 6KB
Rest.java 241KB
Utility.java 240KB
AbstractDataSqlSource.java 167KB
PTestBeanOuterClass.java 160KB
DataSource.java 152KB
DataJdbcSource.java 144KB
DataSqlMapper.java 121KB
FilterNode.java 113KB
ClassReader.java 107KB
HttpRequest.java 105KB
CacheMemorySource.java 100KB
PSimpleBeanOuterClass.java 91KB
CacheSource.java 89KB
MethodWriter.java 85KB
Application.java 74KB
ResourceFactory.java 65KB
EntityInfo.java 63KB
Copier.java 62KB
ConvertFactory.java 61KB
HttpResponse.java 60KB
ClassWriter.java 59KB
WebSocketNode.java 59KB
AbstractDataSource.java 56KB
EntityCache.java 54KB
Sncp.java 53KB
Frame.java 52KB
Attribute.java 51KB
ApiDocCommand.java 48KB
JsonDynEncoder.java 47KB
AsyncConnection.java 46KB
ProtobufConvert.java 38KB
AnyValue.java 38KB
SncpServlet.java 37KB
NodeServer.java 34KB
CachedManagerService.java 34KB
ByteArray.java 33KB
JsonReader.java 32KB
WebSocket.java 32KB
MethodVisitor.java 31KB
CacheMemorySourceTest.java 30KB
JsonByteBufferWriter.java 30KB
ClassFilter.java 29KB
TypeToken.java 29KB
HttpServlet.java 29KB
Type.java 29KB
MessageModuleEngine.java 27KB
AppConfig.java 26KB
Creator.java 26KB
HttpServer.java 25KB
CronExpression.java 25KB
WebSocketEngine.java 25KB
DataSources.java 25KB
NodeHttpServer.java 25KB
SncpRemoteInfo.java 24KB
AsyncNioConnection.java 24KB
SourceModuleEngine.java 23KB
HttpDispatcherServlet.java 23KB
FilterNodes.java 23KB
MessageAgent.java 23KB
EntityBuilder.java 22KB
RedkaleClassLoader.java 22KB
WebSocketServlet.java 22KB
Server.java 22KB
JsonBytesWriter.java 21KB
Label.java 21KB
DataSqlMapperBuilder.java 21KB
ProtobufWriter.java 21KB
ObjectDecoder.java 21KB
ObjectEncoder.java 20KB
FilterJoinNode.java 18KB
Response.java 18KB
WebSocketReadHandler.java 18KB
AnyValueWriter.java 18KB
Client.java 18KB
Transport.java 18KB
CopierTest.java 18KB
WebRequest.java 17KB
DataSqlSource.java 17KB
AsmMethodBoost.java 17KB
FilterNodeBean.java 17KB
ScheduleManagerService.java 17KB
MultiContext.java 16KB
TypeReference.java 16KB
TransportFactory.java 16KB
DataMemorySource.java 16KB
FilterNodeTest.java 15KB
LoggingFileHandler.java 15KB
MessageAsmMethodBoost.java 15KB
JsonConvert.java 15KB
ClientConnection.java 15KB
Inners.java 15KB
CacheClusterAgent.java 14KB
PropertiesModule.java 14KB
共 826 条
- 1
- 2
- 3
- 4
- 5
- 6
- 9
资源评论
wjs2024
- 粉丝: 2403
- 资源: 5545
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 三菱电梯门机板设置资料,包含国产进口,门机板接线图
- 基于机器学习的高效VVC帧内编码器分区方案及其复杂度降低研究
- 阿萨大大萨达瓦萨213
- vs2015U3-OSG+3rdParty(编译好的OSG 32和64位库包,内包含依赖的第三方库)
- P2 PEHV,P2构型插电式混合动力汽车ECMS等效燃油消耗最小能量管理策略 模型全部为自己手动搭建,参考可靠文献,非download随便改改糊弄,真正做到看的懂 P2并联PEHV的ECMS能量管
- Java毕业设计-基于SpringBoot的旅游网站项目源码+数据库(高分毕设)
- 网络安全CTF靶场之DVWA
- 基于自适应控制算法的永磁同步电机位置环算法,适用于机器人伺服电机、云台电机控制,伺服大厂验证并商用的模型
- 网络安全CTF靶场之rce-labs
- 永磁同步电机在线参数辨识仿真模型,使用MRAS算法辨识,辨识精度很高 可提供参考lunwen和解答以及电机控制相关资料
- 网络安全CTF靶场之sqli-labs-master
- python实现深度学习的快速准确检测农作物叶子病害项目源码+数据集.zip
- 网络安全CTF靶场之ssti-labs
- 磁耦合谐振无线电能传输系统仿真 通过负载估算和移相控制的发射端控制方案来调整SS SP谐振拓扑的无线供电系统的输出电压和电流 避免了常规无线电能传输系统中发射端与接收端的实时无线通讯,同时,减少了在
- 网络安全CTF靶场之upload-labs-master
- buck DCDC 适合初学者学习,有配套的设计仿真、原理说明pdf,还有参考轮文,视频 tsmc18工艺,正向设计的恒定时间控制(AOT)的dcdc,电压环路 输入电压1.6-1.8v ,输出电
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功