-
Notifications
You must be signed in to change notification settings - Fork 368
Closed
Labels
type: regressionA regression from a previous releaseA regression from a previous release
Milestone
Description
I have a custom converter JsonNode <-> PGobject
(PGobject represent JSON type for PostgreSQL):
@Configuration
@RequiredArgsConstructor
public class CustomJdbcConfiguration extends AbstractJdbcConfiguration {
private final ObjectMapper objectMapper;
@Override
protected List<?> userConverters() {
return Arrays.asList(
new JsonNodeToJsonConverter(),
new JsonToJsonNodeConverter()
);
}
@ReadingConverter
class JsonToJsonNodeConverter implements Converter<PGobject, JsonNode> {
@Override
public JsonNode convert(PGobject json) {
try {
return objectMapper.readTree(json.getValue());
} catch (JsonProcessingException | NullPointerException e) {
e.printStackTrace();
}
return null;
}
}
@WritingConverter
class JsonNodeToJsonConverter implements Converter<JsonNode, PGobject> {
@Override
public PGobject convert(JsonNode jsonNode) {
PGobject json = new PGobject();
json.setType("jsonb");
try {
json.setValue(objectMapper.writeValueAsString(jsonNode));
} catch (SQLException | JsonProcessingException e) {
e.printStackTrace();
}
return json;
}
}
}
Also, i have a simple repo @Query
method:
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
@Modifying
@Query("UPDATE users SET config = :config::jsonb WHERE login = :login")
void updateConfigByLogin(@Param("config") JsonNode config, @Param("login") String login);
}
Before Spring Data JDBC this converter used normally: old version of code
But, from 2.4.1 version there is a check for Iterable
in StringBasedJdbcQuery
:
JdbcValue jdbcValue;
if (value instanceof Iterable) {
// ..........
Class<?> elementType = resolvableType.getGeneric(0).resolve();
Assert.notNull(elementType, "@Query Iterable parameter generic type could not be resolved!");
// ..........
} else {
jdbcValue = converter.writeJdbcValue(value, type,
JdbcUtil.targetSqlTypeFor(JdbcColumnTypes.INSTANCE.resolvePrimitiveType(type)));
}
JsonNode
implements Iterable
interface, but Class<?> elementType
is null, so assert is failed and custom converter never applied. If manually run else block, conversion goes normally.
Metadata
Metadata
Assignees
Labels
type: regressionA regression from a previous releaseA regression from a previous release