2013-03-06 59 views
0

我有Set<String>類型的某些字段一個POJO。 我想堅持他們的分貝爲JSON,所以我創建一個自定義類型控制器,但是當我試圖堅持我的錯誤:沒有發現類型處理器....spring3 + MyBatis的定製類型控制器

testSave(it.infora.suap.service.MailMessageServiceTest): nested exception is org.apache.ibatis.executor.ExecutorException: There was no TypeHandler found for parameter recipients_to of statement it.infora.suap.persistence.MailMessageMapper.insertEmailMessage 

參數recipients_to在一個Set<String>

,這是我的自定義類型處理器類:

public class SetTypeHandler implements TypeHandler<Set<String>>{ 


    @Override 
    public void setParameter(PreparedStatement ps, int columnIndex, Set<String> parameter, JdbcType jt) throws SQLException { 
    ps.setString(columnIndex, serializeToJson(parameter)); 
    } 

    @Override 
    public Set<String> getResult(ResultSet rs, String columnName) throws SQLException { 
     return deserializeFromJson(rs.getString(columnName)); 
    } 

    @Override 
    public Set<String> getResult(ResultSet rs, int columnIndex) throws SQLException { 
     return deserializeFromJson(rs.getString(columnIndex)); 
    } 

    @Override 
    public Set<String> getResult(CallableStatement cs, int columnIndex) throws SQLException { 
     return deserializeFromJson(cs.getString(columnIndex)); 
    } 

    private String serializeToJson(Set<String> parameter){ 
     Gson gson = new Gson(); 
     return gson.toJson(parameter); 
    } 

    private Set<String> deserializeFromJson(String value){ 
     Gson gson = new Gson(); 
     Type collectionType = new TypeToken<Set<String>>(){}.getType(); 
     Set<String> result = gson.fromJson(value, collectionType); 

     return result;  
    } 

} 

有什麼不對?我使用註釋映射器接口而不是mapper.xml

感謝

安德烈

+1

可以看到你在哪裏使用你的typeHandler的XML? – Vargan 2013-03-06 09:44:28

+0

我沒有mapper.xml ....我使用帶註釋的映射器類。我創建了其他自定義typeHandler來管理枚舉類型字段,並在插入操作期間自動調用 – andrea 2013-03-06 10:00:30

+0

那麼applicationContext.xml又如何呢? – Vargan 2013-03-06 10:05:03

回答

3

我發現了一些信息herehere,但似乎你錯過了

@MappedTypes(Set.class) 
public class SetTypeHandler implements TypeHandler<Set<String>>{ 
+0

我tryed,但它並沒有解決....一線現在我有這個異常'testSave(it.infora.suap.service.MailMessageServiceTest):嵌套的例外是org.apache。 ibatis.builder.BuilderException:解析類時出錯。原因:org.apache.ibatis.type.TypeException:無法解析類型別名'SetTypeHandler.class'。原因:拋出java.lang.ClassNotFoundException:找不到類:SetTypeHandler.class' – andrea 2013-03-06 10:54:31

+0

這是我的映射類'@Insert查詢(「INSERT INTO mail_message(發件人,receive_date,SEND_DATE,文本,附件,recipients_to,recipients_cc,recipients_bcc, subject,mailId)VALUES(#{sender},#{receiveDate}),#{sendDate}),#{text}),#{attachments},#{recipients_to,typeHandler = SetTypeHandler.class},#{recipients_cc,typeHandler = SetTypeHandler.class},{#recipients_bcc,類型控制器= SetTypeHandler.class},{#}受試者,#{mailId})「) @Options(keyProperty = 」ID「,useGeneratedKeys =真,flushCache =真) 公共無效insertEmailMessage(MailMessageBean emailMessage);' – andrea 2013-03-06 10:57:27

+0

嘗試添加SetTypeHandler的完整路徑。例如:it.project.typehandlers.SetTypeHandler.class – Vargan 2013-03-06 11:00:15