spring boot项目开发中遇到问题,持续更新

时间:2023-03-10 03:00:53
spring boot项目开发中遇到问题,持续更新

1.JPA中EntityManager不能执行建表语句,提示要加事务Error:javax.persistence.TransactionRequiredException: Executing an update/delete query 换成直接连数据库原生操作来解决

2.resources下的文件采用中文命名,读取不到。

3.使用h2数据库在加了认证后不能访问h2后台,登录进去为空白f12看到页面有一个错误提示Sorry, Lynx not supported yet 解决方法: 在安全认证配置config文件中的设置过滤不需要认证方法的第一行添加 http.headers().frameOptions().disable();

4.错误信息:exected single matching bean but found 2: mainDataSourceProperties 使用了多个数据源

解决办法在main函数上配置exclude

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class })

5.JAVA反射强转创建对象

public <T extends StandardTable> T createStandardTable(Class<T> clz)
{
StandardTable table = null;
try {
table = (StandardTable) Class.forName(clz.getName()).newInstance();
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException e) {
throw new SystemException("未取到标准表对象");
}
return (T)table;
}

6.获取实体属性和值

/**
* 获取实体属性
* @param o
* @return
*/
private static String[] getFiledName(Object o) {
Field[] fields = o.getClass().getDeclaredFields();
String[] fieldNames = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
fieldNames[i] = fields[i].getName();
}
return fieldNames;
} /**
* 根据属性名获取属性值
* @param fieldName
* @param o
* @return
*/
private static Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[]{});
Object value = method.invoke(o, new Object[]{});
return value;
} catch (Exception e) { return null;
}
}

  

7.在使用spring boot redis缓存后 错误提示 xxx cannot be cast to xxx

注释掉下面的引用问题解决

spring boot项目开发中遇到问题,持续更新

8.@LastModifiedDate无效

springboot jpa 中@LastModifiedDate无效的原因是没有使用标准save方法进行更新 entityDao.save(e);这样是有效会自动更新数据库里的更新时间字段,自定义hql, sql操作@Query(),entityManager操作均需要自己手动处理

9.hibernate查询后的对象,set后,更新数据库的原因

Hibernate的get和load方法查询出的实体都是持久化对象,拿到该对象后,如果你调用了该对象的set方法,那么在事务递交的时候,Hibernate会把你设置的值自动更新到数据库中。

解决办法:

在获取实体对象后,获得HibernateEntityManager,然后调用获得Session,然后在set完之后用Session的.evict()方法清掉该对象缓存(并非所有对象缓存)该方法的作用是把持久化对象变成托管状态。变成托管状态后,Hibernate就不会再去自动更新该实体。

Hibernate的几种实体状态:

1.瞬态:

一个实体通过new操作符创建后,没有和Hibernate的Session建立关系,也没有手动赋值过该实体的持久化标识(持久化标识可以认为是映射表的主键)。
此时该实体中任何属性的更新都不会反映到数据库表中。
2.持久化:
当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而且在Hibernate的Session生命周期内存在。
此时针对该实体任何属性的更改都会直接影响到数据库表中一条记录对应字段的更新,即与数据库表同步。
3.脱管:
当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而此时Hibernate的Session生命周期结束,实体的持久化标识没有被改动过。
针对该实体任何属性的修改都不会及时反映到数据库表中。

关闭session可以使实体从持久化状态转为托管状态。

9.Feign调用报错The bean 'XXX.FeignClientSpecification', defined in null, could not be registered....的解决办法

一种方式在application.yml中配置:

spring:
main:
allow-bean-definition-overriding: true

第二种办法:

可以在@FeignClient注解上添加contextId解决该问题,如:@FeignClient(name="common-service", contextId = "exp")

10.统一不返回某些字段 添加注解 前提是采用的是JackSon进行的序列化以及反序列化

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)

11.springboot

sessionFactory.getCurrentSession() 异常 springboot jpa org.hibernate.HibernateException: No CurrentSessionContext configured!

添加配置信息 解决

spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext

12. JdbcTemplate queryForList方法 通过参数查询数据时 错误

error code [17004]; 无效的列类型; nested exception is java.sql.SQLException: 无效的列类型 

原因:未将args转化为Object[],因为args是List<Object>类型而非Objec[]类型