私信  •  关注

Sander Verhagen

Sander Verhagen 最近创建的主题
Sander Verhagen 最近回复了

这里有很好的答案。我只是添加我的,因为我遇到了同样的错误,但结果却是一个完全不同的问题。(表面上可能相同,但根本原因不同。)

对我来说,以下字段发生了错误:

@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 (这正是我们需要的)。