Java JPA-为什么在应该允许null值的Repository方法中抛出IllegalArgumentExcepti



我有一个JPA存储库方法,它为null值抛出异常。我不明白它为什么抛出异常,因为它在数据库表中可能为null。我还不相信它达到了持久性的程度,但相反,在达到之前要抛出一个例外。

不幸的是,我不得不伪装很多编码(另外,为了可读性,我删除了很多参数,从而简化了编码(。如果有任何见解,我将不胜感激。

以下是异常的关键部分:

java.lang.IllegalArgumentException: Parameter a_e_mark in CMarkRepository.insertCMark must not be null!
at org.springframework.data.repository.core.support.MethodInvocationValidator.invoke(MethodInvocationValidator.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
at com.sun.proxy.$Proxy142.insertCMark(Unknown Source)
at service.SMarkService.postCMark(SMarkService.java:213)
at controller.SMarkController.postCMark(SMarkController.java:259)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
.....

以下是调用代码的重要部分:

public int postCMark    (CMark cMark) {
CMark cm = null;
int status = 0;
try {
status = cMarkRepository.insertCMark(cMark.getCFk(), stringListToStringArray(cMark.getAEMark())));
} catch ( Exception e) {
e.printStackTrace();
}
return status;
}
private String stringListToStringArray(List<String> stringList) {
StringListConverterCommaDelim stringListConverterCommaDelim = new StringListConverterCommaDelim();
return stringListConverterCommaDelim.convertToDatabaseColumn(stringList);
}

这是转换器:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.util.Arrays;
import java.util.List;
import static java.util.Collections.emptyList;
@Converter
public class StringListConverterCommaDelim implements AttributeConverter<List<String>, String> 
{
private static final String SPLIT_CHAR = ",";
@Override
public String convertToDatabaseColumn(List<String> stringList) {
String splitString = null;
if(stringList != null) {
splitString = String.join(SPLIT_CHAR, stringList);
splitString = "{" + splitString + "}";
}
return splitString;
}
@Override
public List<String> convertToEntityAttribute(String string) {
return string != null ? Arrays.asList(string.split(SPLIT_CHAR)) : emptyList();
}
}

这是回购:

public interface CMarkRepository extends JpaRepository <CMark, String> {
@Transactional
@Modifying
@Query(value = "INSERT INTO c_mark(c_fk, a_e_mark) values(:c_fk, :a_e_mark\:\:character varying[])", nativeQuery = true)
int insertClassMark(@Param("c_fk") String classification_fk, @Param("a_e_mark") String a_e_mark);
}

好吧,想通了。只需将@Nullable添加到每个参数即可直接求解:

public interface CMarkRepository extends JpaRepository <CMark, String> {
@Transactional
@Modifying
@Query(value = "INSERT INTO c_mark(c_fk, a_e_mark) values(:c_fk, :a_e_mark\:\:character varying[])", nativeQuery = true)
int insertClassMark(@Param("c_fk") @Nullable String classification_fk, @Param("a_e_mark") @Nullable String a_e_mark);

}

最新更新