自定义参数解析器接收多个实体参数

本文介绍了如何在Spring MVC中创建自定义注解`DataObject`,用于标记方法参数,以及对应的解析器`RequestModelArgumentResolver`,该解析器从HTTP请求体中读取JSON数据并转换为指定的对象类型。通过配置自定义解析器,实现了对请求体中JSON数据的高效处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义参数解析器接收多个实体参数

自定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataObject {
    boolean required() default true;
}

自定义解析器

import com.alibaba.fastjson.JSONObject;
import com.nuts.pangudatastatistic.common.annotation.DataObject;
import org.apache.commons.io.IOUtils;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;

@Component
public class RequestModelArgumentResolver implements HandlerMethodArgumentResolver {
    private static final String JSON_REQUEST_BODY = "JSON_REQUEST_BODY";

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(DataObject.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        String body = getJsonBody(nativeWebRequest);
        if(body.isEmpty()) {
            body = "{}";
        }
        JSONObject jsonBody = JSONObject.parseObject(body);
        return jsonBody.toJavaObject(methodParameter.getParameterType());
    }

    /**
     * 获取body中的数据
     * @param nativeWebRequest 请求
     * @return 请求中的body
     */
    private static String getJsonBody(NativeWebRequest nativeWebRequest) {
        String body = (String) nativeWebRequest.getAttribute(JSON_REQUEST_BODY, NativeWebRequest.SCOPE_REQUEST);
        if(body != null) {
            return body;
        }
        try {
            BufferedReader reader = nativeWebRequest.getNativeRequest(HttpServletRequest.class).getReader();
            body = IOUtils.toString(reader);
            nativeWebRequest.setAttribute(JSON_REQUEST_BODY, body, NativeWebRequest.SCOPE_REQUEST);
        } catch (IOException e) {
            return "";
        }
        return body;
    }
}

配置自定义解析器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Autowired
    private RequestModelArgumentResolver requestModelArgumentResolver;

    @Override
    protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(requestModelArgumentResolver);
    }
}

### 实现自定义数据解析的方法 在 LlamaIndex 中,可以通过实现 `NodeParser` 接口来创建自定义的数据解析。LlamaIndex 提供了多种内置的节点解析,例如用于处理文本、图像描述等非结构化数据的解析,但当这些默认解析无法满足特定需求时,用户可以基于框架提供的接口和基类进行扩展[^3]。 具体而言,需要继承 `NodeParser` 基类,并重写其核心方法 `parse_nodes`。该方法接收一个包含原始文档内容的列表,并返回经过解析后的节点(`Node` 对象)集合。通过这一机制,可以灵活地定义数据的切分逻辑,例如按段落、句子或关键词分割,甚至结合 NLP 技术进行语义级别的拆分[^2]。 以下是一个简单的示例代码,展示如何定义并使用一个自定义的文本分割解析: ```python from llama_index import Document from llama_index.node_parser import NodeParser class CustomTextNodeParser(NodeParser): def __init__(self, chunk_size=100, chunk_overlap=20): self.chunk_size = chunk_size self.chunk_overlap = chunk_overlap def parse_nodes(self, documents: list[Document]) -> list: nodes = [] for doc in documents: text = doc.text start = 0 while start < len(text): end = min(start + self.chunk_size, len(text)) chunk_text = text[start:end] nodes.append(Document(text=chunk_text)) start += (self.chunk_size - self.chunk_overlap) return nodes ``` 上述代码定义了一个基于固定长度块大小和重叠大小的文本解析。它将长文本划分为多个较小的块,每个块之间有部分重叠,以避免信息被截断导致丢失上下文关联性。这种策略尤其适用于处理长篇幅的文档内容[^2]。 完成自定义解析的编写后,可以在加载文档时将其与 `SimpleDirectoryReader` 或其他文档加载配合使用,从而将预处理流程集成到整个索引构建过程中。 此外,在实际应用中还可以进一步优化解析逻辑,例如引入自然语言处理技术识别句子边界、实体或关键短语,并据此划分节点;或者针对多模态数据设计混合型解析策略,使得不同类型的输入都能得到恰当的处理[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值