This commit is contained in:
Redkale
2017-05-13 21:15:53 +08:00
parent 4f7145319f
commit 6e66ee0c99
7 changed files with 19 additions and 34 deletions

View File

@@ -136,11 +136,10 @@
当Server为HTTP协议时, rest节点才有效。存在[rest]节点则Server启动时会加载REST服务, 节点可以多个
base: REST服务的BaseServlet必须是 org.redkale.net.http.HttpServlet 的子类,且子类必须标记@HttpUserType。
autoload默认值"true" 默认值. 加载当前server所能使用的Servce对象;
mustsign默认值"true" 是否只加载标记为RestService的Service类默认只加载标记RestService且ignore=false的Service
includes当autoload="true" 拉取类名与includes中的正则表达式匹配的类, 多个正则表达式用分号;隔开
excludes当autoload="true" 排除类名与excludes中的正则表达式匹配的类, 多个正则表达式用分号;隔开
-->
<rest base="org.redkale.net.http.HttpServlet" mustsign="true" autoload="true" includes="" excludes="">
<rest base="org.redkale.net.http.HttpServlet" autoload="true" includes="" excludes="">
<!--
value: Service类名列出的表示必须被加载的Service对象
ignore: 是否忽略设置为true则不会加载该Service对象默认值为false

View File

@@ -148,7 +148,6 @@ public class NodeHttpServer extends NodeServer {
final Class baseServletClass = Class.forName(restConf.getValue("base", DefaultRestServlet.class.getName()));
final boolean autoload = restConf.getBoolValue("autoload", true);
final boolean mustsign = restConf.getBoolValue("mustsign", true); //是否只加载标记@RestService的Service类
final Set<String> includeValues = new HashSet<>();
final Set<String> excludeValues = new HashSet<>();
@@ -166,15 +165,13 @@ public class NodeHttpServer extends NodeServer {
final Class stype = Sncp.getServiceType(service);
final String name = Sncp.getResourceName(service);
RestService rs = (RestService) stype.getAnnotation(RestService.class);
if (rs != null && rs.ignore()) return;
if (mustsign && rs == null) return;
if (stype.getAnnotation(Local.class) != null && rs == null) return;
if (rs == null || rs.ignore()) return;
final String stypename = stype.getName();
if (!autoload && !includeValues.contains(stypename)) return;
if (!restFilter.accept(stypename)) return;
HttpServlet servlet = httpServer.addRestServlet(name, stype, service, baseServletClass, mustsign, prefix, (AnyValue) null);
HttpServlet servlet = httpServer.addRestServlet(name, stype, service, baseServletClass, prefix, (AnyValue) null);
resourceFactory.inject(servlet, NodeHttpServer.this);
if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet);
if (ss != null) {

View File

@@ -103,7 +103,7 @@ public final class HttpServer extends Server<String, HttpContext, HttpRequest, H
* @return RestServlet
*/
public <S extends Service, T extends HttpServlet> T addRestServlet(String name, Class<S> serviceType, S service, Class<T> baseServletClass, String prefix) {
return addRestServlet(name, serviceType, service, baseServletClass, true, prefix, null);
return addRestServlet(name, serviceType, service, baseServletClass, prefix, null);
}
/**
@@ -115,32 +115,13 @@ public final class HttpServer extends Server<String, HttpContext, HttpRequest, H
* @param serviceType Service的类型
* @param service Service对象
* @param baseServletClass RestServlet基类
* @param mustsign 是否必须有Rest注解标记才生成Rest方法
* @param prefix url前缀
*
* @return RestServlet
*/
public <S extends Service, T extends HttpServlet> T addRestServlet(String name, Class<S> serviceType, S service, Class<T> baseServletClass, final boolean mustsign, String prefix) {
return addRestServlet(name, serviceType, service, baseServletClass, mustsign, prefix, null);
}
/**
* 添加RestServlet
*
* @param <S> Service
* @param <T> RestServlet
* @param name Service的资源名
* @param serviceType Service的类型
* @param service Service对象
* @param baseServletClass RestServlet基类
* @param mustsign 是否必须有Rest注解标记才生成Rest方法
* @param prefix url前缀
* @param conf 配置信息
*
* @return RestServlet
*/
public <S extends Service, T extends HttpServlet> T addRestServlet(
final String name, Class<S> serviceType, final S service, final Class<T> baseServletClass, final boolean mustsign, final String prefix, AnyValue conf) {
public <S extends Service, T extends HttpServlet> T addRestServlet(final String name, final Class<S> serviceType,
final S service, final Class<T> baseServletClass, final String prefix, final AnyValue conf) {
T servlet = null;
for (final HttpServlet item : ((HttpPrepareServlet) this.prepare).getServlets()) {
if (!(item instanceof HttpServlet)) continue;
@@ -157,7 +138,7 @@ public final class HttpServer extends Server<String, HttpContext, HttpRequest, H
}
}
final boolean first = servlet == null;
if (servlet == null) servlet = Rest.createRestServlet(baseServletClass, serviceType, mustsign);
if (servlet == null) servlet = Rest.createRestServlet(baseServletClass, serviceType);
try { //若提供动态变更Service服务功能则改Rest服务无法做出相应更新
Field field = servlet.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME);
field.setAccessible(true);

View File

@@ -104,7 +104,7 @@ public final class Rest {
return (!controller.name().isEmpty()) ? controller.name() : serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase();
}
static <T extends HttpServlet> T createRestServlet(final Class<T> baseServletClass, final Class<? extends Service> serviceType, final boolean mustsign) {
static <T extends HttpServlet> T createRestServlet(final Class<T> baseServletClass, final Class<? extends Service> serviceType) {
if (baseServletClass == null || serviceType == null) return null;
if (!HttpServlet.class.isAssignableFrom(baseServletClass)) return null;
int mod = baseServletClass.getModifiers();
@@ -223,7 +223,8 @@ public final class Rest {
if ("version".equals(method.getName())) continue;
RestMapping[] mappings = method.getAnnotationsByType(RestMapping.class);
if (mustsign && mappings.length < 1) continue;
if (controller == null) continue;
if (!controller.automapping() && mappings.length < 1) continue;
boolean ignore = false;
for (RestMapping mapping : mappings) {
if (mapping.ignore()) {

View File

@@ -36,6 +36,13 @@ public @interface RestService {
*/
int moduleid() default 0;
/**
* 没有标记&#64;RestMapping的方法是否转换 默认为false
*
* @return 默认false
*/
boolean automapping() default false;
/**
* 是否屏蔽该类的转换
*

View File

@@ -18,7 +18,7 @@ import org.redkale.util.*;
* HelloBean: Hello模块实现FilterBean的过滤Bean类
*
*/
@RestService
@RestService(automapping = true)
public class HelloService implements Service {
private int nodeid;

View File

@@ -19,7 +19,7 @@ import org.redkale.util.Sheet;
* HelloBean: Hello模块实现FilterBean的过滤Bean类
*
*/
@RestService(name = "hello", moduleid = 0, repair = true, ignore = false, comment = "Hello服务模块")
@RestService(name = "hello", moduleid = 0, automapping = true, repair = true, ignore = false, comment = "Hello服务模块")
public class HelloService2 implements Service {
@Resource