用jython實(shí)現(xiàn)java調(diào)用python

          1. 在Eclipse中創(chuàng)建springboot工程(maven)

          2. 配置pom.xml
            <?xml version="1.0" encoding="UTF-8"?>
            <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation
            ="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
                <modelVersion>4.0.0</modelVersion>
                <parent>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-parent</artifactId>
                    <version>3.0.5</version>
                    <relativePath/> <!-- lookup parent from repository -->
                </parent>
                <groupId>com.example</groupId>
                <artifactId>demo</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <packaging>war</packaging>
                <name>demo</name>
                <description>Demo project for Spring Boot</description>
                <properties>
                    <java.version>17</java.version>
                </properties>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-web</artifactId>
                    </dependency>
                    
                    <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-json</artifactId>
                    </dependency>

                    <dependency>
                        <groupId>org.python</groupId>
                        <artifactId>jython-slim</artifactId>
                        <version>2.7.3</version>
                    </dependency>
                    <dependency>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-test</artifactId>
                        <scope>test</scope>
                    </dependency>
                </dependencies>

                <build>
                    <plugins>
                        <plugin>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-maven-plugin</artifactId>
                        </plugin>
                    </plugins>
                </build>

            </project>
          3. 編寫python代碼  
             /src/main/resources/case.py
            class RequestObj:
                def __init__(self,requestId):
                    self.requestid=requestId
                    
            class ResponseObj:
                def __init__(self,apiId):
                    self.apiId=apiId
                    
            def testAPI(requestObj):
                if requestObj.requestId == "1" :
                    responseObj=ResponseObj("/test/1")
                elif requestObj.requestId == "2" :
                    responseObj=ResponseObj("/test/2")
                else:
                    responseObj=ResponseObj("/test")
                return responseObj
          4. 編寫java代碼 
            /src/main/java/com/example/demo/json/Request.java
            package com.example.demo.json;

            public class Request {
                private String requsetId;
                private String name;

                public String getName() {
                    return name;
                }

                public void setName(String name) {
                    this.name = name;
                }

                public String getRequsetId() {
                    return requsetId;
                }

                public void setRequsetId(String requsetId) {
                    this.requsetId = requsetId;
                }

            }
            /src/main/java/com/example/demo/json/Response.java
            package com.example.demo.json;

            public class Response {
                private String apiId;

                public String getApiId() {
                    return apiId;
                }

                public void setApiId(String apiId) {
                    this.apiId = apiId;
                }
                
            }
            /src/main/java/com/example/demo/RestAPIController.java
            package com.example.demo;

            import java.io.IOException;

            import org.python.core.PyFunction;
            import org.python.core.PyObject;
            import org.python.core.PyString;
            import org.python.util.PythonInterpreter;
            import org.springframework.core.io.ClassPathResource;
            import org.springframework.core.io.Resource;
            import org.springframework.web.bind.annotation.GetMapping;
            import org.springframework.web.bind.annotation.PostMapping;
            import org.springframework.web.bind.annotation.RequestBody;
            import org.springframework.web.bind.annotation.RestController;

            import com.example.demo.json.Request;
            import com.example.demo.json.Response;

            @RestController
            public class RestAPIController {
                private static PythonInterpreter interpreter;
                private static Resource resource = new ClassPathResource("case.py");
                private static String path;
                static {
                    interpreter = new PythonInterpreter();
                    try {
                        path = resource.getFile().getPath();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

                private Response callPythonFunc(String funcName, Request request) {
                    interpreter.execfile(path);
                    PyObject requestObj = interpreter.get("RequestObj", PyObject.class);
                    requestObj.__setattr__("requestId", new PyString(request.getRequsetId()));
                    PyFunction function = interpreter.get(funcName, PyFunction.class);
                    PyObject responseObj = function.__call__(requestObj);
                    String apiId = responseObj.__getattr__("apiId").toString();
                    Response response = new Response();
                    response.setApiId(apiId);
                    return response;
                }


                
                @GetMapping("/test/get")
                public String test1() {
                    Request request = new Request();
                    request.setRequsetId("1");
                    Response response = callPythonFunc("testAPI", request);
                    return response.getApiId();
                }

                @PostMapping("/test/post")
                public Response test2(@RequestBody Request request) {
                    Response response = callPythonFunc("testAPI", request);
                    return response;
                }
            }

          5. 運(yùn)行springboot應(yīng)用程序,console信息如下
             /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
            ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
             \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
              '  |____| .__|_| |_|_| |_\__, | / / / /
             =========|_|==============|___/=/_/_/_/
             :: Spring Boot ::                (v3.0.5)
            2023-05-20T23:07:51.546+09:00  INFO 17548 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication using Java 17.0.6 with PID 17548 (D:\pleiades\workspace\demo\target\classes started by lzqdi in D:\pleiades\workspace\demo)
            2023-05-20T23:07:51.550+09:00  INFO 17548 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to 1 default profile: "default"
            2023-05-20T23:07:52.760+09:00  INFO 17548 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
            2023-05-20T23:07:52.777+09:00  INFO 17548 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
            2023-05-20T23:07:52.778+09:00  INFO 17548 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.7]
            2023-05-20T23:07:52.904+09:00  INFO 17548 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
            2023-05-20T23:07:52.908+09:00  INFO 17548 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1286 ms
            2023-05-20T23:07:55.673+09:00  INFO 17548 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [static/index.html]
            2023-05-20T23:07:55.832+09:00  INFO 17548 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
            2023-05-20T23:07:55.846+09:00  INFO 17548 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 4.604 seconds (process running for 5.36)
            2023-05-20T23:08:36.469+09:00  INFO 17548 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
            2023-05-20T23:08:36.469+09:00  INFO 17548 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
            2023-05-20T23:08:36.474+09:00  INFO 17548 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms
          6. 啟動(dòng)Postman進(jìn)行測試





            ■項(xiàng)目文件構(gòu)成如下



          posted on 2023-05-20 22:54 我為J狂 閱讀(178) 評(píng)論(0)  編輯  收藏 所屬分類: 開源框架

          <2023年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(11)

          隨筆分類(48)

          文章分類(29)

          常去逛逛

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 桂林市| 喀喇沁旗| 万盛区| 徐闻县| 麦盖提县| 龙井市| 钟山县| 玉龙| 顺义区| 宝山区| 黑河市| 大名县| 滦平县| 镇坪县| 巴塘县| 永嘉县| 酉阳| 淄博市| 梨树县| 项城市| 文水县| 宁津县| 房产| 崇左市| 秦皇岛市| 上饶市| 遵义市| 江都市| 治县。| 永登县| 交口县| 四平市| 宁国市| 通山县| 筠连县| 开江县| 洛阳市| 临江市| 石家庄市| 通道| 城市|