[
https://issues.apache.org/jira/browse/SOLR-10364?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15944539#comment-15944539
]
Huaping Gu commented on SOLR-10364:
-----------------------------------
Seems only datastax combine Cassandra and Solr together, share the same bean.
For Solr only this is not a bug, should be only one feature enhancements.
> Solr bean binding only support List and Map?
> --------------------------------------------
>
> Key: SOLR-10364
> URL: https://issues.apache.org/jira/browse/SOLR-10364
> Project: Solr
> Issue Type: Bug
> Security Level: Public(Default Security Level. Issues are Public)
> Components: SolrJ
> Affects Versions: 4.10.4, 6.4.2
> Reporter: Huaping Gu
> Fix For: 4.10.4
>
>
> In class DocumentObjectBinder.java, when jnject a value from doc to bean
> class, seems it only support List and Map, and not support Set. In Cassandra
> the collection types includes "set" which Cassandra Java Driver treat it as
> LinkedHashSet.
> I have a column defined type set<test>. And in the Java Pojo, I set it as
> Set<String>.
> It will success in Cassandra binding, but fail in Solr with following error:
> Caused by: java.lang.IllegalArgumentException: Can not set java.util.Set
> field com.xxx.xxxx to java.util.ArrayList
>
> But If I set it Pojo to List<String>, Solr binding will success, but
> Cassandra will fail and give me error as bellow:
> argument type mismatch - had objects of type "java.util.LinkedHashSet" but
> expected signature "java.util.List"
> I believe following code may need an update? Which only care about List and
> Map.
> <T> void inject(T obj, SolrDocument sdoc) {
> Object val = getFieldValue(sdoc);
> if(val == null) {
> return;
> }
> if (isArray && !isContainedInMap) {
> List list;
> if (val.getClass().isArray()) {
> set(obj, val);
> return;
> } else if (val instanceof List) {
> list = (List) val;
> } else {
> list = new ArrayList();
> list.add(val);
> }
> set(obj, list.toArray((Object[]) Array.newInstance(type,
> list.size())));
> } else if (isList && !isContainedInMap) {
> if (!(val instanceof List)) {
> List list = new ArrayList();
> list.add(val);
> val = list;
> }
> set(obj, val);
> } else if (isContainedInMap) {
> if (val instanceof Map) {
> set(obj, val);
> }
> } else {
> set(obj, val);
> }
> }
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]