Как использовать весенний фреймворк FactoryBean для вызова Python скрипта? - PullRequest
1 голос
/ 13 января 2020

Моя основная задача - вызвать скрипт python и передать вывод python в Java. Для этого я использую PythonInterpreter для выполнения сценария python, для которого мне нужно было использовать реализацию SpringBramework FactoryBean.

Когда я вызываю метод весенней загрузки JavaNPython из JavaNPyController класса, я получаю `TypeError: не могу преобразовать

{'errorcode': '0', 'errormessage': "'success'", 'parsedoutput': [{'columnname': 'DepartmentGroupName', 'columnalias': 'DepartmentGroupName', 'tablename': 'DimDepartmentGroup', 'expression': 'DepartmentGroupName', 'schemaname': '', 'tablealias': 'DimDepartmentGroup'}, {'columnname': 'OrganizationName', 'columnalias': 'OrganizationName', 'tablename': 'DimDepartmentGroup', 'expression': 'OrganizationName', 'schemaname': '', 'tablealias': 'DimOrganization'}, {'columnname': 'CurrencyKey', 'columnalias': 'CurrencyKey', 'tablename': 'DimDepartmentGroup', 'expression': 'CurrencyKey', 'schemaname': '', 'tablealias': 'DimOrganization'}]} to java.lang.String` error which I have no clue how to or where to do changes.

Вот части кода ..

My Factory Bean Interface:

package com.tm.service;

public interface JavaNPYService {
    //String getHello();
    String parsesqlstatement(String sql);
    String test();

}

My FactoryBean Класс реализации:

package com.tm.service;

import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;

@Configuration
@Service
//@Qualifier("javaServicePython")
@Qualifier("tm_sqlParser")
public class JavaServiceFactory implements FactoryBean<JavaNPYService> {

    // @Override
    public JavaNPYService getObject() {

        PyObject buildingObject = null;
        try {
            // Here is the actual code that interprets our python file.
            PythonInterpreter interpreter = new PythonInterpreter();
            interpreter.execfile("src/main/java/com/tm/service/tm_sqlParser.py");
            buildingObject = interpreter.get("tm_sqlParser").__call__();

        } catch (Exception e) {
            e.printStackTrace();            
        }
        // Cast the created object to our Java interface
buildingObject.__tojava__(JavaNPYService.class));
        return (JavaNPYService) buildingObject.__tojava__(JavaNPYService.class);
    }

    // @Override
    public Class<?> getObjectType() {
        return JavaNPYService.class;
    }

}

Мой класс Controller, где определяется вызов метода:

package com.tm.controller;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tm.service.JavaNPYService;

@RestController
public class JavaNPyController {
    private static final Logger logger = LoggerFactory.getLogger(JavaNPyController.class);
    @Autowired
    @Qualifier("tm_sqlParser")
    private JavaNPYService service;

    @RequestMapping("/JavaNPython")
    public String index() {
        logger.info("JavaNPyController index() called");
        String pythonOutput = service.test(); //This is where the error occurs

        JsonFactory factory = new JsonFactory();

        ObjectMapper mapper = new ObjectMapper(factory);
        JsonNode rootNode = null;
        try {
            rootNode = mapper.readTree(pythonOutput);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Iterator<Map.Entry<String, JsonNode>> fieldsIterator = rootNode.fields();
        while (fieldsIterator.hasNext()) {

            Map.Entry<String, JsonNode> field = fieldsIterator.next();
            System.out.println("Key: " + field.getKey() + "\tValue:" + field.getValue());
        }

        System.setProperty("python.console.encoding", "UTF-8");
        logger.info("The final output from controller>>" + pythonOutput);
        return pythonOutput.toString();
    }

}

Python script ::

import sys, os
sys.path.append('src/main/java/com/tm/service')

from tm_sqlParserUtil import *
#from com.tm.service import tm_sqlParserUtil
from com.tm.service import JavaNPYService
#import sys
class tm_sqlParser(JavaNPYService):

    def parseSQL(self, sql1):
        data=processSQL(sql1)
        output=''

        if 'errorcode' in data:
            perrorcode=data['errorcode']
            if perrorcode==0:
                output=getParsedOutput(data)
            else:
                output=data
        return output
    def parseSQLsFromfile():
        processFiles()
        print('...............End of Processing......................')
    #parseSQLsFromfile()
    #comments to be handled // and /*
    #parseSQL(samplesql)
    def parsesqlstatement(self, inputstring):
        tmpinputstring=inputstring
        samplesql=''
        if 'context' in tmpinputstring:
            tmpcontext=tmpinputstring['context']
        if 'sqltoparse' in inputstring:
            samplesql=tmpinputstring['sqltoparse']
        if samplesql =='':
            output=populateexceptiondetails('NOT_VALID_SQL_2')
        else:
            output=self.parseSQL(samplesql)
        return output
    def test(self):
        str1={}
        str1['context']='report1'
        str1['sqltoparse']='SELECT  DimDepartmentGroup.DepartmentGroupName,  DimOrganization.OrganizationName,  DimOrganization.CurrencyKey FROM  DimDepartmentGroup INNER JOIN FactFinance ON (FactFinance.DepartmentGroupKey=DimDepartmentGroup.DepartmentGroupKey)  INNER JOIN DimOrganization ON (FactFinance.OrganizationKey=DimOrganization.OrganizationKey)'
        output=self.parsesqlstatement(str1)
        return output
#print(test())

Ошибка, которую я получаю после того, как вызов сделан в Java классе :: enter image description here

Вывод сценария python: ..

{'errorcode': '0', 'errormessage': "'success'", 'parsedoutput': [{'columnname': 'DepartmentGroupName', 'columnalias': 'DepartmentGroupName', 'tablename': 'DimDepartmentGroup', 'expression': 'DepartmentGroupName', 'schemaname': '', 'tablealias': 'DimDepartmentGroup'}, {'columnname': 'OrganizationName', 'columnalias': 'OrganizationName', 'tablename': 'DimDepartmentGroup', 'expression': 'OrganizationName', 'schemaname': '', 'tablealias': 'DimOrganization'}, {'columnname': 'CurrencyKey', 'columnalias': 'CurrencyKey', 'tablename': 'DimDepartmentGroup', 'expression': 'CurrencyKey', 'schemaname': '', 'tablealias': 'DimOrganization'}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...