【问题标题】:Getting JSONArray from mysql database Using Spring boot JPA使用 Spring Boot JPA 从 mysql 数据库中获取 JSONArray
【发布时间】:2021-08-23 04:37:36
【问题描述】:

在我的 mysql 表中有存储“JSONArray”的列

这是 spring-boot 项目中模型类的一部分。

public class SubQuestions implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "sub_questionId", nullable = false,columnDefinition = "INT(11) UNSIGNED")
    private Integer sub_questionId;

    private JSONArray answers;

}

已经有模型类具有空构造函数、具有所有字段的构造函数、getter 和 setter。

这是我的 SubQuestionsRepository 接口。

public interface SubQuestionsRepository extends Serializable,JpaRepository<Questions,Integer>{

}

这是我的控制器类的一部分。

public class SubQuestionsController implements Serializable{
 private SubQuestionsRepository subquestionsrepository;


    public SubQuestionsController(SubQuestionsRepository subquestionsrepository) {
        super();
        this.SubQuestionsRepository = subquestionsrepository;
    }

    @GetMapping("/getall")
    public  Collection<SubQuestions> getallnestedques(){
        return subquestionsrepository.getactiveques();
    }
}

但是当我调用“getallnestedques()”方法时,它会出现以下错误。

There was an unexpected error (type=Internal Server Error, status=500).
could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize
org.springframework.orm.jpa.JpaSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:353)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMeth

我该如何解决?

【问题讨论】:

  • SubQuestionsRepository 应该扩展 JpaRepository&lt;SubQuestions,Integer&gt; 而不是 JpaRepository&lt;Questions,Integer&gt;。不是吗?如果你在 Spring 中使用基于注解的配置,那么你应该分别使用 @Entity@Repository@Controller 来注解模型类、存储库和控制器。并在 SubQuestions Model 类中用 DB 中的相应列名标记 answers 字段。在提供答案时,将answers 保存在数据库中的格式会更有帮助。

标签: java mysql spring-boot spring-data-jpa json-arrayagg


【解决方案1】:

你能试试下面的解决方案吗?

需要将answers 列声明为Lob,如下例所示:

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;

import org.json.JSONArray;

@Entity
public class SubQuestions implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "sub_questionId", nullable = false,columnDefinition = "INT(11) UNSIGNED")
    private Integer sub_questionId;

    @Lob
    @Column
    @Convert(converter = JSONArrayConverter.class)
    private JSONArray answers;
}

属性转换器JSONArrayConverter在存储到数据库之前将JSONArray对象转换为String并在从数据库中读取值后转换为JSONArray

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

import org.json.JSONArray;
import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.Logger;

@Converter(autoApply = true)
public class JSONArrayConverter implements AttributeConverter<JSONArray, String> {

    private static final Logger logger = (Logger) LoggerFactory.getLogger(JSONArrayConverter.class);

    @Override
    public String convertToDatabaseColumn(JSONArray array)
    {
        String data = null;
        try
        {
            data = array.toString();
        }
        catch (final Exception e)
        {
            logger.error("JSON writing error", e);
        }

        return data;
    }

    @Override
    public JSONArray convertToEntityAttribute(String data)
    {
        JSONArray array = null;

        try
        {
            array = new JSONArray(data);
        }
        catch (final Exception e)
        {
            logger.error("JSON reading error", e);
        }

        return array;
    }
}

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2019-12-06
    • 2016-10-11
    • 2016-12-02
    相关资源
    最近更新 更多