最近在开发的时候,遇到一个小问题:
Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'DomainID' in 'class java.lang.Integer'
这是 mybatis 源文件
1 public ABLayer GetInfos(final int DomainID) {
2
3 return sqlSession.selectOne("abLayer.GetInfos",DomainID);
4 }
<!---->
<select id="GetInfos" parameterType="java.lang.Integer" resultMap="ABLayer">
select *
from ab_layer
<where>
<if test="DomainID != null and DomainID !='' ">
DomainID=#{DomainID}
</if>
</where>
order by ID
</select>
分析:
当我去掉<if>条件之后
<where>
<if test="DomainID != null and DomainID !='' ">
DomainID=#{DomainId}
</if>
</where>
有可以正常运行.仔细debug了一下源码并查看了一下官方文档,发现Mybatis解析使用的ognl表达式,我们知道ognl的上下文OgnlContext使用的时候Map接口
1 public class OgnlContext implements Map {
2 public static final String CONTEXT_CONTEXT_KEY = "context";
3 public static final String ROOT_CONTEXT_KEY = "root";
4 public static final String THIS_CONTEXT_KEY = "this";
5 public static final String TRACE_EVALUATIONS_CONTEXT_KEY = "_traceEvaluations";
6 public static final String LAST_EVALUATION_CONTEXT_KEY = "_lastEvaluation";
7 public static final String KEEP_LAST_EVALUATION_CONTEXT_KEY = "_keepLastEvaluation";
8 public static final String CLASS_RESOLVER_CONTEXT_KEY = "_classResolver";
9 public static final String TYPE_CONVERTER_CONTEXT_KEY = "_typeConverter";
10 public static final String MEMBER_ACCESS_CONTEXT_KEY = "_memberAccess";
11 private static final String PROPERTY_KEY_PREFIX = "ognl";
并且OgnlRutime中包含了许多的Bean类型,在源码中可以看到
1 //
2 // Source code recreated from a .class file by IntelliJ IDEA
3 // (powered by Fernflower decompiler)
4 //
5
6 package org.apache.ibatis.ognl;
7
8 import java.beans.IndexedPropertyDescriptor;
9 import java.beans.IntrospectionException;
10 import java.beans.Introspector;
11 import java.beans.PropertyDescriptor;
12 import java.lang.reflect.Constructor;
13 import java.lang.reflect.Field;
14 import java.lang.reflect.InvocationTargetException;
15 import java.lang.reflect.Member;
16 import java.lang.reflect.Method;
17 import java.lang.reflect.Modifier;
18 import java.lang.reflect.Proxy;
19 import java.math.BigDecimal;
20 import java.math.BigInteger;
21 import java.security.Permission;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.Iterator;
27 import java.util.List;
28 import java.util.Map;
60 public abstract class OgnlRuntime {
61 public static final Object NotFound = new Object();
62 public static final List NotFoundList = new ArrayList();
63 public static final Map NotFoundMap = new HashMap();
64 public static final Object[] NoArguments = new Object[0];
65 public static final Class[] NoArgumentTypes = new Class[0];
66 public static final Object NoConversionPossible = "org.apache.ibatis.ognl.NoConversionPossible";
67 public static int INDEXED_PROPERTY_NONE = 0;
68 public static int INDEXED_PROPERTY_INT = 1;
69 public static int INDEXED_PROPERTY_OBJECT = 2;
70 public static final String NULL_STRING = "" + null;
71 private static final String SET_PREFIX = "set";
72 private static final String GET_PREFIX = "get";
73 private static final String IS_PREFIX = "is";
74 private static final Map HEX_PADDING = new HashMap();
75 private static final String HEX_PREFIX = "0x";
76 private static final int HEX_LENGTH = 8;
77 private static final String NULL_OBJECT_STRING = "<null>";
78 private static OgnlRuntime.ClassCache methodAccessors = new OgnlRuntime.ClassCache();
79 private static OgnlRuntime.ClassCache propertyAccessors = new OgnlRuntime.ClassCache();
80 private static OgnlRuntime.ClassCache elementsAccessors = new OgnlRuntime.ClassCache();
81 private static OgnlRuntime.ClassCache nullHandlers = new OgnlRuntime.ClassCache();
82 private static OgnlRuntime.ClassCache propertyDescriptorCache = new OgnlRuntime.ClassCache();
83 private static OgnlRuntime.ClassCache constructorCache = new OgnlRuntime.ClassCache();
84 private static OgnlRuntime.ClassCache staticMethodCache = new OgnlRuntime.ClassCache();
85 private static OgnlRuntime.ClassCache instanceMethodCache = new OgnlRuntime.ClassCache();
86 private static OgnlRuntime.ClassCache invokePermissionCache = new OgnlRuntime.ClassCache();
87 private static OgnlRuntime.ClassCache fieldCache = new OgnlRuntime.ClassCache();
88 private static List superclasses = new ArrayList();
89 private static OgnlRuntime.ClassCache[] declaredMethods = new OgnlRuntime.ClassCache[]{new OgnlRuntime.ClassCache(), new OgnlRuntime.ClassCache()};
90 private static Map primitiveTypes = new HashMap(101);
91 private static OgnlRuntime.ClassCache primitiveDefaults = new OgnlRuntime.ClassCache();
92 private static Map methodParameterTypesCache = new HashMap(101);
93 private static Map ctorParameterTypesCache = new HashMap(101);
94 private static SecurityManager securityManager = System.getSecurityManager();
95 private static EvaluationPool evaluationPool = new EvaluationPool();
96 private static ObjectArrayPool objectArrayPool = new ObjectArrayPool();
97
98 static {
99 ArrayPropertyAccessor p = new ArrayPropertyAccessor();
100 Class var10000 = class$0;
101 if(class$0 == null) {
102 try {
103 var10000 = Class.forName("java.lang.Object");
104 } catch (ClassNotFoundException var51) {
105 throw new NoClassDefFoundError(var51.getMessage());
106 }
107
108 class$0 = var10000;
109 }
110
111 setPropertyAccessor(var10000, new ObjectPropertyAccessor());
112 var10000 = class$1;
113 if(class$1 == null) {
114 try {
115 var10000 = Class.forName("[B");
116 } catch (ClassNotFoundException var50) {
117 throw new NoClassDefFoundError(var50.getMessage());
118 }
119
120 class$1 = var10000;
121 }
122
123 setPropertyAccessor(var10000, p);
124 var10000 = class$2;
125 if(class$2 == null) {
126 try {
127 var10000 = Class.forName("[S");
128 } catch (ClassNotFoundException var49) {
129 throw new NoClassDefFoundError(var49.getMessage());
130 }
131
132 class$2 = var10000;
133 }
134
135 setPropertyAccessor(var10000, p);
136 var10000 = class$3;
137 if(class$3 == null) {
138 try {
139 var10000 = Class.forName("[C");
140 } catch (ClassNotFoundException var48) {
141 throw new NoClassDefFoundError(var48.getMessage());
142 }
143
144 class$3 = var10000;
145 }
146
147 setPropertyAccessor(var10000, p);
148 var10000 = class$4;
149 if(class$4 == null) {
150 try {
151 var10000 = Class.forName("[I");
152 } catch (ClassNotFoundException var47) {
153 throw new NoClassDefFoundError(var47.getMessage());
154 }
155
156 class$4 = var10000;
157 }
158
159 setPropertyAccessor(var10000, p);
160 var10000 = class$5;
161 if(class$5 == null) {
162 try {
163 var10000 = Class.forName("[J");
164 } catch (ClassNotFoundException var46) {
165 throw new NoClassDefFoundError(var46.getMessage());
166 }
167
168 class$5 = var10000;
169 }
170
171 setPropertyAccessor(var10000, p);
172 var10000 = class$6;
173 if(class$6 == null) {
174 try {
175 var10000 = Class.forName("[F");
176 } catch (ClassNotFoundException var45) {
177 throw new NoClassDefFoundError(var45.getMessage());
178 }
179
180 class$6 = var10000;
181 }
182
183 setPropertyAccessor(var10000, p);
184 var10000 = class$7;
185 if(class$7 == null) {
186 try {
187 var10000 = Class.forName("[D");
188 } catch (ClassNotFoundException var44) {
189 throw new NoClassDefFoundError(var44.getMessage());
190 }
191
192 class$7 = var10000;
193 }
194
195 setPropertyAccessor(var10000, p);
196 var10000 = class$8;
197 if(class$8 == null) {
198 try {
199 var10000 = Class.forName("[Ljava.lang.Object;");
200 } catch (ClassNotFoundException var43) {
201 throw new NoClassDefFoundError(var43.getMessage());
202 }
203
204 class$8 = var10000;
205 }
206
207 setPropertyAccessor(var10000, p);
208 var10000 = class$9;
209 if(class$9 == null) {
210 try {
211 var10000 = Class.forName("java.util.List");
212 } catch (ClassNotFoundException var42) {
213 throw new NoClassDefFoundError(var42.getMessage());
214 }
215
216 class$9 = var10000;
217 }
218
219 setPropertyAccessor(var10000, new ListPropertyAccessor());
220 var10000 = class$10;
221 if(class$10 == null) {
222 try {
223 var10000 = Class.forName("java.util.Map");
224 } catch (ClassNotFoundException var41) {
225 throw new NoClassDefFoundError(var41.getMessage());
226 }
227
228 class$10 = var10000;
229 }
230
231 setPropertyAccessor(var10000, new MapPropertyAccessor());
232 var10000 = class$11;
233 if(class$11 == null) {
234 try {
235 var10000 = Class.forName("java.util.Set");
236 } catch (ClassNotFoundException var40) {
237 throw new NoClassDefFoundError(var40.getMessage());
238 }
239
240 class$11 = var10000;
241 }
242
243 setPropertyAccessor(var10000, new SetPropertyAccessor());
244 var10000 = class$12;
245 if(class$12 == null) {
246 try {
247 var10000 = Class.forName("java.util.Iterator");
248 } catch (ClassNotFoundException var39) {
249 throw new NoClassDefFoundError(var39.getMessage());
250 }
251
252 class$12 = var10000;
253 }
254
255 setPropertyAccessor(var10000, new IteratorPropertyAccessor());
256 var10000 = class$13;
257 if(class$13 == null) {
258 try {
259 var10000 = Class.forName("java.util.Enumeration");
260 } catch (ClassNotFoundException var38) {
261 throw new NoClassDefFoundError(var38.getMessage());
262 }
263
264 class$13 = var10000;
265 }
266
267 setPropertyAccessor(var10000, new EnumerationPropertyAccessor());
268 ArrayElementsAccessor e = new ArrayElementsAccessor();
269 var10000 = class$0;
270 if(class$0 == null) {
271 try {
272 var10000 = Class.forName("java.lang.Object");
273 } catch (ClassNotFoundException var37) {
274 throw new NoClassDefFoundError(var37.getMessage());
275 }
276
277 class$0 = var10000;
278 }
279
280 setElementsAccessor(var10000, new ObjectElementsAccessor());
281 var10000 = class$1;
282 if(class$1 == null) {
283 try {
284 var10000 = Class.forName("[B");
285 } catch (ClassNotFoundException var36) {
286 throw new NoClassDefFoundError(var36.getMessage());
287 }
288
289 class$1 = var10000;
290 }
291
292 setElementsAccessor(var10000, e);
293 var10000 = class$2;
294 if(class$2 == null) {
295 try {
296 var10000 = Class.forName("[S");
297 } catch (ClassNotFoundException var35) {
298 throw new NoClassDefFoundError(var35.getMessage());
299 }
300
301 class$2 = var10000;
302 }
303
304 setElementsAccessor(var10000, e);
305 var10000 = class$3;
306 if(class$3 == null) {
307 try {
308 var10000 = Class.forName("[C");
309 } catch (ClassNotFoundException var34) {
310 throw new NoClassDefFoundError(var34.getMessage());
311 }
312
313 class$3 = var10000;
314 }
315
316 setElementsAccessor(var10000, e);
317 var10000 = class$4;
318 if(class$4 == null) {
319 try {
320 var10000 = Class.forName("[I");
321 } catch (ClassNotFoundException var33) {
322 throw new NoClassDefFoundError(var33.getMessage());
323 }
324
325 class$4 = var10000;
326 }
327
328 setElementsAccessor(var10000, e);
329 var10000 = class$5;
330 if(class$5 == null) {
331 try {
332 var10000 = Class.forName("[J");
333 } catch (ClassNotFoundException var32) {
334 throw new NoClassDefFoundError(var32.getMessage());
335 }
336
337 class$5 = var10000;
338 }
339
340 setElementsAccessor(var10000, e);
341 var10000 = class$6;
342 if(class$6 == null) {
343 try {
344 var10000 = Class.forName("[F");
345 } catch (ClassNotFoundException var31) {
346 throw new NoClassDefFoundError(var31.getMessage());
347 }
348
349 class$6 = var10000;
350 }
351
352 setElementsAccessor(var10000, e);
353 var10000 = class$7;
354 if(class$7 == null) {
355 try {
356 var10000 = Class.forName("[D");
357 } catch (ClassNotFoundException var30) {
358 throw new NoClassDefFoundError(var30.getMessage());
359 }
360
361 class$7 = var10000;
362 }
363
364 setElementsAccessor(var10000, e);
365 var10000 = class$8;
366 if(class$8 == null) {
367 try {
368 var10000 = Class.forName("[Ljava.lang.Object;");
369 } catch (ClassNotFoundException var29) {
370 throw new NoClassDefFoundError(var29.getMessage());
371 }
372
373 class$8 = var10000;
374 }
375
376 setElementsAccessor(var10000, e);
377 var10000 = class$14;
378 if(class$14 == null) {
379 try {
380 var10000 = Class.forName("java.util.Collection");
381 } catch (ClassNotFoundException var28) {
382 throw new NoClassDefFoundError(var28.getMessage());
383 }
384
385 class$14 = var10000;
386 }
387
388 setElementsAccessor(var10000, new CollectionElementsAccessor());
389 var10000 = class$10;
390 if(class$10 == null) {
391 try {
392 var10000 = Class.forName("java.util.Map");
393 } catch (ClassNotFoundException var27) {
394 throw new NoClassDefFoundError(var27.getMessage());
395 }
396
397 class$10 = var10000;
398 }
399
400 setElementsAccessor(var10000, new MapElementsAccessor());
401 var10000 = class$12;
402 if(class$12 == null) {
403 try {
404 var10000 = Class.forName("java.util.Iterator");
405 } catch (ClassNotFoundException var26) {
406 throw new NoClassDefFoundError(var26.getMessage());
407 }
408
409 class$12 = var10000;
410 }
411
412 setElementsAccessor(var10000, new IteratorElementsAccessor());
413 var10000 = class$13;
414 if(class$13 == null) {
415 try {
416 var10000 = Class.forName("java.util.Enumeration");
417 } catch (ClassNotFoundException var25) {
418 throw new NoClassDefFoundError(var25.getMessage());
419 }
420
421 class$13 = var10000;
422 }
423
424 setElementsAccessor(var10000, new EnumerationElementsAccessor());
425 var10000 = class$15;
426 if(class$15 == null) {
427 try {
428 var10000 = Class.forName("java.lang.Number");
429 } catch (ClassNotFoundException var24) {
430 throw new NoClassDefFoundError(var24.getMessage());
431 }
432
433 class$15 = var10000;
434 }
435
436 setElementsAccessor(var10000, new NumberElementsAccessor());
437 ObjectNullHandler nh = new ObjectNullHandler();
438 var10000 = class$0;
439 if(class$0 == null) {
440 try {
441 var10000 = Class.forName("java.lang.Object");
442 } catch (ClassNotFoundException var23) {
443 throw new NoClassDefFoundError(var23.getMessage());
444 }
445
446 class$0 = var10000;
447 }
448
449 setNullHandler(var10000, nh);
450 var10000 = class$1;
451 if(class$1 == null) {
452 try {
453 var10000 = Class.forName("[B");
454 } catch (ClassNotFoundException var22) {
455 throw new NoClassDefFoundError(var22.getMessage());
456 }
457
458 class$1 = var10000;
459 }
460
461 setNullHandler(var10000, nh);
462 var10000 = class$2;
463 if(class$2 == null) {
464 try {
465 var10000 = Class.forName("[S");
466 } catch (ClassNotFoundException var21) {
467 throw new NoClassDefFoundError(var21.getMessage());
468 }
469
470 class$2 = var10000;
471 }
472
473 setNullHandler(var10000, nh);
474 var10000 = class$3;
475 if(class$3 == null) {
476 try {
477 var10000 = Class.forName("[C");
478 } catch (ClassNotFoundException var20) {
479 throw new NoClassDefFoundError(var20.getMessage());
480 }
481
482 class$3 = var10000;
483 }
484
485 setNullHandler(var10000, nh);
486 var10000 = class$4;
487 if(class$4 == null) {
488 try {
489 var10000 = Class.forName("[I");
490 } catch (ClassNotFoundException var19) {
491 throw new NoClassDefFoundError(var19.getMessage());
492 }
493
494 class$4 = var10000;
495 }
496
497 setNullHandler(var10000, nh);
498 var10000 = class$5;
499 if(class$5 == null) {
500 try {
501 var10000 = Class.forName("[J");
502 } catch (ClassNotFoundException var18) {
503 throw new NoClassDefFoundError(var18.getMessage());
504 }
505
506 class$5 = var10000;
507 }
508
509 setNullHandler(var10000, nh);
510 var10000 = class$6;
511 if(class$6 == null) {
512 try {
513 var10000 = Class.forName("[F");
514 } catch (ClassNotFoundException var17) {
515 throw new NoClassDefFoundError(var17.getMessage());
516 }
517
518 class$6 = var10000;
519 }
520
521 setNullHandler(var10000, nh);
522 var10000 = class$7;
523 if(class$7 == null) {
524 try {
525 var10000 = Class.forName("[D");
526 } catch (ClassNotFoundException var16) {
527 throw new NoClassDefFoundError(var16.getMessage());
528 }
529
530 class$7 = var10000;
531 }
532
533 setNullHandler(var10000, nh);
534 var10000 = class$8;
535 if(class$8 == null) {
536 try {
537 var10000 = Class.forName("[Ljava.lang.Object;");
538 } catch (ClassNotFoundException var15) {
539 throw new NoClassDefFoundError(var15.getMessage());
540 }
541
542 class$8 = var10000;
543 }
544
545 setNullHandler(var10000, nh);
546 ObjectMethodAccessor ma = new ObjectMethodAccessor();
547 var10000 = class$0;
548 if(class$0 == null) {
549 try {
550 var10000 = Class.forName("java.lang.Object");
551 } catch (ClassNotFoundException var14) {
552 throw new NoClassDefFoundError(var14.getMessage());
553 }
554
555 class$0 = var10000;
556 }
557
558 setMethodAccessor(var10000, ma);
559 var10000 = class$1;
560 if(class$1 == null) {
561 try {
562 var10000 = Class.forName("[B");
563 } catch (ClassNotFoundException var13) {
564 throw new NoClassDefFoundError(var13.getMessage());
565 }
566
567 class$1 = var10000;
568 }
569
570 setMethodAccessor(var10000, ma);
571 var10000 = class$2;
572 if(class$2 == null) {
573 try {
574 var10000 = Class.forName("[S");
575 } catch (ClassNotFoundException var12) {
576 throw new NoClassDefFoundError(var12.getMessage());
577 }
578
579 class$2 = var10000;
580 }
581
582 setMethodAccessor(var10000, ma);
583 var10000 = class$3;
584 if(class$3 == null) {
585 try {
586 var10000 = Class.forName("[C");
587 } catch (ClassNotFoundException var11) {
588 throw new NoClassDefFoundError(var11.getMessage());
589 }
590
591 class$3 = var10000;
592 }
593
594 setMethodAccessor(var10000, ma);
595 var10000 = class$4;
596 if(class$4 == null) {
597 try {
598 var10000 = Class.forName("[I");
599 } catch (ClassNotFoundException var10) {
600 throw new NoClassDefFoundError(var10.getMessage());
601 }
602
603 class$4 = var10000;
604 }
605
606 setMethodAccessor(var10000, ma);
607 var10000 = class$5;
608 if(class$5 == null) {
609 try {
610 var10000 = Class.forName("[J");
611 } catch (ClassNotFoundException var9) {
612 throw new NoClassDefFoundError(var9.getMessage());
613 }
614
615 class$5 = var10000;
616 }
617
618 setMethodAccessor(var10000, ma);
619 var10000 = class$6;
620 if(class$6 == null) {
621 try {
622 var10000 = Class.forName("[F");
623 } catch (ClassNotFoundException var8) {
624 throw new NoClassDefFoundError(var8.getMessage());
625 }
626
627 class$6 = var10000;
628 }
629
630 setMethodAccessor(var10000, ma);
631 var10000 = class$7;
632 if(class$7 == null) {
633 try {
634 var10000 = Class.forName("[D");
635 } catch (ClassNotFoundException var7) {
636 throw new NoClassDefFoundError(var7.getMessage());
637 }
638
639 class$7 = var10000;
640 }
641
642 setMethodAccessor(var10000, ma);
643 var10000 = class$8;
644 if(class$8 == null) {
645 try {
646 var10000 = Class.forName("[Ljava.lang.Object;");
647 } catch (ClassNotFoundException var6) {
648 throw new NoClassDefFoundError(var6.getMessage());
649 }
650
651 class$8 = var10000;
652 }
653
654 setMethodAccessor(var10000, ma);
655 primitiveTypes.put("boolean", Boolean.TYPE);
656 primitiveTypes.put("byte", Byte.TYPE);
657 primitiveTypes.put("short", Short.TYPE);
658 primitiveTypes.put("char", Character.TYPE);
659 primitiveTypes.put("int", Integer.TYPE);
660 primitiveTypes.put("long", Long.TYPE);
661 primitiveTypes.put("float", Float.TYPE);
662 primitiveTypes.put("double", Double.TYPE);
663 primitiveDefaults.put(Boolean.TYPE, Boolean.FALSE);
664 primitiveDefaults.put(Byte.TYPE, new Byte((byte)0));
665 primitiveDefaults.put(Short.TYPE, new Short((short)0));
666 primitiveDefaults.put(Character.TYPE, new Character('\u0000'));
667 primitiveDefaults.put(Integer.TYPE, new Integer(0));
668 primitiveDefaults.put(Long.TYPE, new Long(0L));
669 primitiveDefaults.put(Float.TYPE, new Float(0.0F));
670 primitiveDefaults.put(Double.TYPE, new Double(0.0D));
671 OgnlRuntime.ClassCache var52 = primitiveDefaults;
672 Class var10001 = class$16;
673 if(class$16 == null) {
674 try {
675 var10001 = Class.forName("java.math.BigInteger");
676 } catch (ClassNotFoundException var5) {
677 throw new NoClassDefFoundError(var5.getMessage());
678 }
679
680 class$16 = var10001;
681 }
682
683 var52.put(var10001, new BigInteger("0"));
684 var52 = primitiveDefaults;
685 var10001 = class$17;
686 if(class$17 == null) {
687 try {
688 var10001 = Class.forName("java.math.BigDecimal");
689 } catch (ClassNotFoundException var4) {
690 throw new NoClassDefFoundError(var4.getMessage());
691 }
692
693 class$17 = var10001;
694 }
695
696 var52.put(var10001, new BigDecimal(0.0D));
697 }
698
它提供支持许多的bean类8个基本类型,还有map,list,arraylist等.然后使用对象提供的set和get来进行数据绑定.而ognl在解析xml的时候,会首先进入该源代码
public class OgnlParserTokenManager implements OgnlParserConstants {
Object literalValue;
private char charValue;
private char charLiteralStartQuote;
private StringBuffer stringBuffer;
public PrintStream debugStream;
static final long[] jjbitVec0 = new long[]{2301339413881290750L, -16384L, 4294967295L, 432345564227567616L};
static final long[] jjbitVec2 = new long[]{0L, 0L, 0L, -36028797027352577L};
static final long[] jjbitVec3 = new long[]{0L, -1L, -1L, -1L};
static final long[] jjbitVec4 = new long[]{-1L, -1L, 65535L, 0L};
static final long[] jjbitVec5 = new long[]{-1L, -1L, 0L, 0L};
static final long[] jjbitVec6 = new long[]{70368744177663L, 0L, 0L, 0L};
static final long[] jjbitVec7 = new long[]{-2L, -1L, -1L, -1L};
static final long[] jjbitVec8 = new long[]{0L, 0L, -1L, -1L};
static final int[] jjnextStates = new int[]{15, 16, 18, 19, 22, 13, 24, 25, 7, 9, 10, 13, 17, 10, 13, 11, 12, 20, 21, 1, 2, 3};
public static final String[] jjstrLiteralImages = new String[]{"", ",", "=", "?", ":", "||", "or", "&&", "and", "|", "bor", "^", "xor", "&", "band", "==", "eq", "!=", "neq", "<", "lt", ">", "gt", "<=", "lte", ">=", "gte", "in", "not", "<<", "shl", ">>", "shr", ">>>", "ushr", "+", "-", "*", "/", "%", "~", "!", "instanceof", ".", "(", ")", "true", "false", "null", "#this", "#root", "#", "[", "]", "{", "}", "@", "new", "$", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null};
public static final String[] lexStateNames = new String[]{"DEFAULT", "WithinCharLiteral", "WithinBackCharLiteral", "WithinStringLiteral"};
可以看到需要#{}之类的 或者#name等才能被ognl识别,然后才能解析...,然后回到我们的这个问题
对于if语句中的 DomainID 并没有被标识符标记,因而识别不出,所以启动ognl解析的时候,会自认为他是自定义的变量,自定义它的开发者应该会编写它对应的get和set方法,所以ongl会默认的去调用该对象的set,get方法,然而
我们对Domain对象是一个java.lang.Integer对象,本身没有get,set方法。所以才会爆出开始的那些异常. 这应该就是问题所在了,然后如何解决呢?
1. 方法一:
封装一下这个元素或者使用map来封装.
//对DomainID进行封装
class myId{
private Integer DomainID;
public Integer getDomainID(){
return DomainID;
}
public void SetDomainID(Integer id){
DomainID = id;
}
}
2.采用将DomainID改为 _parameter
<where>
<if test="_parameter != null and _parameter !='' ">
DomainID=#{_parameter}
</if>
</where>
3.使用@Param注解
如果我们使用的是接口Interface方式
使用
public ABLayer GetInfos( @Param(value="DomainID") Integer DomainID);
<select id="GetInfos" parameterType="java.lang.Integer" resultMap="ABLayer">
select *
from ab_layer
<where>
<if test="DomainID != null and DomainID !='' ">
DomainID=#{DomainID}
</if>
</where>
order by ID
</select>