UNPKG

node-web-mvc

Version:
108 lines (107 loc) 6.41 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const RequestResponseBodyMethodProcessor_1 = __importDefault(require("../processor/RequestResponseBodyMethodProcessor")); const RequestParamMapMethodArgumentResolver_1 = __importDefault(require("./RequestParamMapMethodArgumentResolver")); const RequestHeaderMapMethodArgumentResolver_1 = __importDefault(require("./RequestHeaderMapMethodArgumentResolver")); const PathVariableMapMethodArgumentResolver_1 = __importDefault(require("./PathVariableMapMethodArgumentResolver")); const ServletContextMethodArgumentResolver_1 = __importDefault(require("./ServletContextMethodArgumentResolver")); const ArgumentResolvError_1 = __importDefault(require("../../../errors/ArgumentResolvError")); const IllegalArgumentException_1 = __importDefault(require("../../../errors/IllegalArgumentException")); const ParamAnnotation_1 = __importDefault(require("../../annotations/params/ParamAnnotation")); const ValueConvertError_1 = __importDefault(require("../../../errors/ValueConvertError")); const ArgumentConvertError_1 = __importDefault(require("../../../errors/ArgumentConvertError")); const MultipartFile_1 = __importDefault(require("../../http/MultipartFile")); const Javascript_1 = __importDefault(require("../../../interface/Javascript")); const ModelAttributeMethodProcessor_1 = __importDefault(require("../processor/ModelAttributeMethodProcessor")); const RequestPartArgumentResolver_1 = __importDefault(require("./RequestPartArgumentResolver")); const HttpEntityMethodProcessor_1 = __importDefault(require("../processor/HttpEntityMethodProcessor")); const DataValidator_1 = __importDefault(require("../../../validation/DataValidator")); const TypeConverter_1 = __importDefault(require("../../../serialization/TypeConverter")); const converter = new TypeConverter_1.default(); class ArgumentsResolvers { constructor(messageConverter, contentNegotialManager) { this.messageConverter = messageConverter; this.registerResolvers = [ new PathVariableMapMethodArgumentResolver_1.default(), new RequestHeaderMapMethodArgumentResolver_1.default(), new RequestParamMapMethodArgumentResolver_1.default(false), new RequestPartArgumentResolver_1.default(), new HttpEntityMethodProcessor_1.default(messageConverter, contentNegotialManager), new ModelAttributeMethodProcessor_1.default(), new RequestResponseBodyMethodProcessor_1.default(this.messageConverter, contentNegotialManager), new ServletContextMethodArgumentResolver_1.default(), ]; this.fallbackResolvers = [ new RequestParamMapMethodArgumentResolver_1.default(true), ]; } /** * 注册一个参数解析器 * @param resolver 解析器 */ addArgumentResolvers(resolver) { this.registerResolvers.push(resolver); } /** * 获取要执行函数的参数值信息 */ async resolveArguments(servletContext, handler) { let parameter; try { const signParameters = handler.parameters; const args = []; for (let i = 0, k = signParameters.length; i < k; i++) { parameter = signParameters[i]; const anno = parameter.getParameterAnnotation(ParamAnnotation_1.default); const value = await this.resolveArgument(parameter, servletContext); const hasResolved = (value !== undefined && value !== null); let finalValue = hasResolved ? value : anno === null || anno === void 0 ? void 0 : anno.defaultValue; const hasNotValue = finalValue === null || finalValue === undefined; if (hasNotValue && (anno === null || anno === void 0 ? void 0 : anno.required)) { // 如果参数必要,且没有值则抛出异常 const message = `Required ${anno.paramAt} '${parameter.paramName}' is not present ==> ${handler.beanTypeName}.${handler.methodName}`; throw new ArgumentResolvError_1.default(message, parameter.paramName); } else if (hasNotValue && !(anno === null || anno === void 0 ? void 0 : anno.required)) { // 如果参数不必要,且没有值,则忽略 args[i] = undefined; continue; } if (finalValue instanceof MultipartFile_1.default && Javascript_1.default.createTyper(parameter.parameterType).isType(Array)) { finalValue = [finalValue]; } // 设置参数值 args[i] = converter.convert(finalValue, parameter.parameterType, parameter.runtimeType); // 验证数据 await (new DataValidator_1.default()).validate(args[i], parameter); } return args; } catch (ex) { if (ex instanceof ValueConvertError_1.default) { return Promise.reject(new ArgumentConvertError_1.default(parameter === null || parameter === void 0 ? void 0 : parameter.paramName, ex)); } if (ex instanceof Error && ex.constructor !== Error) { return Promise.reject(ex); } return Promise.reject(new ArgumentResolvError_1.default(ex, parameter === null || parameter === void 0 ? void 0 : parameter.paramName)); } } /** * 解析当前参数值 * @param { MethodParameter } parameter 当前参数 * @param { ServletContext } servletContext 当前请求上下文 */ resolveArgument(parameter, servletContext) { const registerResolvers = [].concat(this.registerResolvers, this.fallbackResolvers); const resolver = registerResolvers.find((resolver) => resolver.supportsParameter(parameter, servletContext)); if (resolver === null) { throw new IllegalArgumentException_1.default('Unsupported parameter type [' + Object.prototype.toString.call(parameter.parameterType) + ']. supportsParameter should be called first.'); } return resolver.resolveArgument(parameter, servletContext); } } exports.default = ArgumentsResolvers;