node-web-mvc
Version:
node spring mvc
108 lines (107 loc) • 6.41 kB
JavaScript
;
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;