这里有很好的答案。我只是添加我的,因为我遇到了同样的错误,但结果却是一个完全不同的问题。(表面上可能相同,但根本原因不同。)
对我来说,以下字段发生了错误:
@Column(nullable = false, columnDefinition = "VARCHAR(255)")
private URI consulUri;
这最终作为
URI
班级。这不会对单元测试(使用h2)或ci/集成测试(使用
MariaDB4j
)在我们的生产中爆炸了。(不过,一旦理解了问题,就很容易在mariadb4j实例中看到错误的值;它只是没有破坏测试。)解决方案是构建一个自定义类型映射器:
package redacted;
import javax.persistence.AttributeConverter;
import java.net.URI;
import java.net.URISyntaxException;
import static java.lang.String.format;
public class UriConverter implements AttributeConverter<URI, String> {
@Override
public String convertToDatabaseColumn(URI attribute) {
return attribute.toString();
}
@Override
public URI convertToEntityAttribute(String field) {
try {
return new URI(field);
}
catch (URISyntaxException e) {
throw new RuntimeException(format("could not convert database field to URI: %s", field));
}
}
}
使用如下:
@Column(nullable = false, columnDefinition = "VARCHAR(255)")
@Convert(converter = UriConverter.class)
private URI consulUri;
就hibernate而言,它似乎有很多
provided type mappers
,包括
java.net.URL
,但不是为了
java.net.URI
(这正是我们需要的)。