Вставьте JSON в PostgreSQL - PullRequest
       14

Вставьте JSON в PostgreSQL

1 голос
/ 10 июля 2019

Я пытаюсь вставить объект json, предоставленный клиентом ARC (аналогично почтальону), в мой контроллер webService, затем в PostgreSQL 11,4 дБ, используя Java 8, Eclipse и SpringBoot.Я получаю следующую ошибку:

2019-07-10 13:02:42.356 ERROR 21516 --- [nio-8086-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [INSERT INTO cwb_patent(patent_number,created_date,patent_data) VALUES (?,current_timestamp,cast(? AS JSON)) ON CONFLICT (patent_number) DO UPDATE SET patent_data  = cast(? AS JSON), created_date = current_timestamp]; nested exception is org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of com.clarivate.singularity.chemworkbench.webservices.common.PatentChemicalData. Use setObject() with an explicit Types value to specify the type to use.] with root cause
org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of com.clarivate.singularity.chemworkbench.webservices.common.PatentChemicalData. Use setObject() with an explicit Types value to specify the type to use.
at org.postgresql.jdbc.PgPreparedStatement.setObject(PgPreparedStatement.java:967) ~[postgresql-42.2.2.jar:42.2.2]

Мой запрос:

public static final String mergeCwbPatent = "INSERT INTO cwb_patent" + 
        "(patent_number,created_date,patent_data)" +
        " VALUES (:patent_number,current_timestamp,cast(:patent_data AS JSON))" +
        " ON CONFLICT (patent_number)" +
        " DO UPDATE SET patent_data  = cast(:patent_data AS JSON), created_date = current_timestamp";

Мой контроллер:

 @RequestMapping(value = "/merge-patent-data", method = RequestMethod.POST)
public Long  mergePatentChemicalData(@RequestBody  PatentChemicalData patentChemicalData) { 
    Long ret = db.mergeCwbPatent(patentChemicalData);
    return ret;
}

И метод вставки::

public Long mergeCwbPatent(PatentChemicalData pcd)
{
    Map<String, Object> parameters = new HashMap<String, Object>();

    Long ret = null;
    String patentNumber;

    if (pcd == null )
    {
        logger.error("DS4A Trying to Insert invalid PatentChemicalData into CWB_PATENT");
    }else {
        patentNumber=pcd.getPatentChemicalData().getPatentNumber();

        logger.debug("DS4B Inserting data for patentNumber = " + patentNumber + " into cwb_patent");
        parameters.put("patent_number", patentNumber);  // THIS LINE THROWS THE ERROR
        parameters.put("patent_data", pcd);   // This is the JSON object

        ret = jdbcTemplate.queryForObject(SqlQueries.mergeCwbPatent, parameters,Long.class);

    }

    return ret;
}

В трассировке стека написано «Use Use setObject ()», но это не относится к моим параметрам HashMap.Эта ссылка tenmilessquare говорит о том, что я на правильном пути, но я не могу заставить его работать.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 11 июля 2019

Следуя совету @a_horse_with_no_name, я добавил функцию для преобразования объекта PatentChemicalData в строку:

public String patentChemicalDataToJson(PatentChemicalData pcd) throws JsonProcessingException {
     ObjectMapper Obj = new ObjectMapper();
     String jsonStr = Obj.writeValueAsString(pcd);
     return jsonStr;
}

Затем в mergeCwbPatent () я использовал эту функцию, как было предложено:

String jsonPcdStr= sf.patentChemicalDataToJson(pcd);
parameters.put("patent_data", jsonPcdStr);

И это работало нормально.Я уже включил Джексона, и я подумал, что SpringBoot сделал преобразование Джексона автоматически, но это не так.Проблема с SpringBoot в том, что это делает вас ленивыми!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...