SpringBoot接收前端传来的json数据

本文探讨了前后端交互中两种常用的数据接收方式:使用POJO和Map。对比了这两种方式的优缺点,并提出了结合PO和VO的方法来提高开发效率。

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

当前端传来json数据时,后端有两种方式可以接收:使用POJOMap进行接收。

前端json数据:

{
	id:121,      //数字
	name:"lhj",     //字符串
	scoreList:[     //对象
				{Java:95},  
				{Python:98},
				{C++:94}
				]
		}

一、使用POJO

若前端传递过来的数据刚好和我们的bean实体对象属性一致,则可以使用对象的形式接收

后端实体类

@Component
public class Score {
    private int id;
    private String name;
    private List<ScoreList> scoreList;
}

后端Controller

@PostMapping("/student/score")
public void getScore(@RequestBody Score score){
	System.out.println(score);
    }

● 前端数据和bean对象属性要一致
必须使用@RequestBody注解

二、使用Map接收

若前端传递过来的数据很复杂,没有对应的POJO与其对应,就可以用Map进行接收。

后台Controller

@PostMapping("/lhj/getdata")
public void getData(@RequestBody Map<String,Object>map){
	System.out.println(map);
    }

对于Map<String,Object>,值的类型建议设置为Object,这样可以使Map能接收各种类型的数据,如字符串、数字、数组和对象等。

使用POJO和Map接收的比较

1、map的优点:

● 灵活性更强,易扩展,耦合度低;
● 代码简洁;
MyBatis查询的返回结果本身就是Map,效率可能会比返回JavaBean高

2、map的缺点

JavaBean的数据在编译期就会对其进行校验,如果出错会直接提示。而Map的数据则需要到sql层才会进行处理检验。因此如果map的参数名称写错、参数值如果多传乱传只能到sql层才会被发现。
● Map中所拥有的参数个数、类型、每个参数代表的含义对外不透明,团队开发及后期维护难度大

3、JavaBean的优点:

● 面向对象的良好诠释;
● 数据结构清晰,便于团队开发和后期维护;
● 代码足够健壮,可以排除掉编译期错误

4、javabean的缺点:

● 代码量增多,大量时间去封装用到的表对象。
● 可能会影响开发效率。

三、PO和VO相结合

创建PO与数据库字段对应,用于对数据库的操作;
创建VO用于封装和前端打交道的数据,使用VO可以避免使用Map

### Java 调用 Python 模型的方法 Java 后端可以通过多种方式调用 Python 的机器学习模型。以下是几种常见的实现方法及其对应的示例代码。 #### 1. 使用 PMML 文件作为中间媒介 通过将 Python 训练好的模型导出为 PMML (Predictive Model Markup Language) 文件,可以在 Java 中加载并执行该模型[^2]。这种方式的优点在于无需直接运行 Python 环境,缺点是部分复杂模型可能不支持完全转换到 PMML。 ##### 示例代码:Python 导出 PMML 和 Java 加载 PMML ```python from sklearn.tree import DecisionTreeClassifier from sklearn2pmml import PMMLPipeline, sklearn2pmml # 创建简单的决策树分类器 pipeline = PMMLPipeline([("classifier", DecisionTreeClassifier())]) pipeline.fit([[0], [1]], ["no", "yes"]) # 将模型保存为 PMML 文件 sklearn2pmml(pipeline, "decision_tree.pmml", with_repr=True) ``` 在 Java 中使用 JPMML 库加载 PMML 文件: ```java import org.jpmml.evaluator.Evaluator; import org.jpmml.evaluator.ModelEvaluatorFactory; public class PmmlModelLoader { public static void main(String[] args) throws Exception { Evaluator evaluator = ModelEvaluatorFactory.newInstance().newModelManager(new File("decision_tree.pmml")); System.out.println(evaluator.getModelName()); } } ``` --- #### 2. 基于 HTTP 接口的方式 如果无法使用 PMML 或其他静态文件形式,则可以构建一个基于 Flask/Django 的 RESTful API 来暴露 Python 模型服务,并让 Java 客户端发送请求来获取预测结果[^3]。 ##### 示例代码:Flask 构建 Python 模型服务 ```python from flask import Flask, request, jsonify import joblib app = Flask(__name__) model = joblib.load('trained_model.pkl') # 加载训练好的模型 @app.route('/predict', methods=['POST']) def predict(): data = request.get_json(force=True) prediction = model.predict([data['features']]) return jsonify({'prediction': str(prediction[0])}) if __name__ == '__main__': app.run(port=5000, debug=False) ``` ##### 示例代码:Java 发送 POST 请求给 Python 服务 ```java import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; public class HttpClientExample { public static String sendPostRequest() throws Exception { URL url = new URL("http://localhost:5000/predict"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "application/json"); String jsonInputString = "{\"features\": [1, 2, 3]}"; try(OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream())) { out.write(jsonInputString); } int responseCode = conn.getResponseCode(); if(responseCode == HttpURLConnection.HTTP_OK){ return "Prediction successful!"; }else{ return "Failed : HTTP error code : "+responseCode; } } } ``` --- #### 3. 使用 JNI/JPype 实现本地调用 对于性能敏感的应用场景,可以直接利用 JPype 或者 Py4J 这样的工具,在 JVM 内部嵌入 Python 解释器并调用其函数[^1]。不过需要注意的是,这种方法可能会增加系统的复杂度以及维护成本。 ##### 示例代码:JPype 调用 Python 函数 ```java import org.jpype.JPype; import org.jpype.startup.JPypeStarter; public class JpypeExample { public static void main(String[] args) { JPypeStarter.startJPype("/path/to/python/lib/site-packages"); // 设置 Python 环境路径 Object result = JPype.eval("your_python_function(your_input)"); System.out.println(result.toString()); JPype.shutdownJPype(); // 关闭连接 } } ``` --- #### 总结 以上三种方案各有优劣,具体选择取决于实际需求和技术栈限制条件。当追求简单部署时推荐采用 PMML 方案;而需要灵活性较高的情况下则更适合选用 Web Service 形式的交互模式或者借助 JNI 技术完成更紧密集成操作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值