package com.w11k.lsql.converter.predefined; import com.fasterxml.jackson.core.type.TypeReference; import com.w11k.lsql.LSql; import com.w11k.lsql.converter.Converter; import java.io.IOException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; public class ObjectToJsonStringConverter extends Converter { private Class<?> clazz; private TypeReference typeReference; public <A> ObjectToJsonStringConverter(Class<A> clazz, TypeReference typeReference) { super( clazz, new int[]{Types.VARCHAR}, Types.VARCHAR ); this.clazz = clazz; this.typeReference = typeReference; } @Override public boolean isValueValid(Object value) { if (value == null && isNullValid()) { return true; } else if (value == null) { return false; } return clazz.isAssignableFrom(value.getClass()); } @Override public void setValue(LSql lSql, PreparedStatement ps, int index, Object val) throws SQLException { try { String json = lSql.getObjectMapper().writer().writeValueAsString(val); ps.setString(index, json); } catch (IOException e) { throw new RuntimeException(e); } } @Override public Object getValue(LSql lSql, ResultSet rs, int index) throws SQLException { String json = rs.getString(index); try { if (typeReference != null) { return lSql.getObjectMapper().readValue(json, typeReference); } else { return lSql.getObjectMapper().readValue(json, clazz); } } catch (IOException e) { throw new RuntimeException(e); } } }