Моя основная задача - вызвать скрипт 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 классе :: 
Вывод сценария 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'}]}