SPR-5663: test and fix: inconsistency between canRead() and read() on ReflectivePropertyResolver
This commit is contained in:
parent
b1000cd5c6
commit
d34a2c5d02
|
|
@ -88,7 +88,7 @@ public class ReflectivePropertyResolver implements PropertyAccessor {
|
||||||
|
|
||||||
public TypedValue read(EvaluationContext context, Object target, String name) throws AccessException {
|
public TypedValue read(EvaluationContext context, Object target, String name) throws AccessException {
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
return null;
|
throw new AccessException("Cannot read property of null target");
|
||||||
}
|
}
|
||||||
Class<?> type = (target instanceof Class ? (Class<?>) target : target.getClass());
|
Class<?> type = (target instanceof Class ? (Class<?>) target : target.getClass());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,13 @@
|
||||||
|
|
||||||
package org.springframework.expression.spel;
|
package org.springframework.expression.spel;
|
||||||
|
|
||||||
|
import org.springframework.expression.AccessException;
|
||||||
|
import org.springframework.expression.EvaluationContext;
|
||||||
import org.springframework.expression.Expression;
|
import org.springframework.expression.Expression;
|
||||||
import org.springframework.expression.ParserContext;
|
import org.springframework.expression.ParserContext;
|
||||||
|
import org.springframework.expression.PropertyAccessor;
|
||||||
import org.springframework.expression.spel.antlr.SpelAntlrExpressionParser;
|
import org.springframework.expression.spel.antlr.SpelAntlrExpressionParser;
|
||||||
|
import org.springframework.expression.spel.support.ReflectivePropertyResolver;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests based on Jiras up to the release of Spring 3.0.0
|
* Tests based on Jiras up to the release of Spring 3.0.0
|
||||||
|
|
@ -27,24 +31,11 @@ import org.springframework.expression.spel.antlr.SpelAntlrExpressionParser;
|
||||||
*/
|
*/
|
||||||
public class SpringEL300Tests extends ExpressionTestCase {
|
public class SpringEL300Tests extends ExpressionTestCase {
|
||||||
|
|
||||||
|
public void testNPE_SPR5661() {
|
||||||
public static final ParserContext DOLLARSQUARE_TEMPLATE_PARSER_CONTEXT = new ParserContext() {
|
|
||||||
public String getExpressionPrefix() {
|
|
||||||
return "$[";
|
|
||||||
}
|
|
||||||
public String getExpressionSuffix() {
|
|
||||||
return "]";
|
|
||||||
}
|
|
||||||
public boolean isTemplate() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public void testNPE_5661() {
|
|
||||||
evaluate("joinThreeStrings('a',null,'c')", "anullc", String.class);
|
evaluate("joinThreeStrings('a',null,'c')", "anullc", String.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNPE_5673() throws Exception {
|
public void testNPE_SPR5673() throws Exception {
|
||||||
ParserContext hashes = TemplateExpressionParsingTests.HASH_DELIMITED_PARSER_CONTEXT;
|
ParserContext hashes = TemplateExpressionParsingTests.HASH_DELIMITED_PARSER_CONTEXT;
|
||||||
ParserContext dollars = TemplateExpressionParsingTests.DEFAULT_TEMPLATE_PARSER_CONTEXT;
|
ParserContext dollars = TemplateExpressionParsingTests.DEFAULT_TEMPLATE_PARSER_CONTEXT;
|
||||||
|
|
||||||
|
|
@ -78,6 +69,28 @@ public class SpringEL300Tests extends ExpressionTestCase {
|
||||||
checkTemplateParsingError("Hello ${","No ending suffix '}' for expression starting at character 6: ${");
|
checkTemplateParsingError("Hello ${","No ending suffix '}' for expression starting at character 6: ${");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testAccessingNullPropertyViaReflection_SPR5663() throws AccessException {
|
||||||
|
PropertyAccessor propertyAccessor = new ReflectivePropertyResolver();
|
||||||
|
EvaluationContext context = TestScenarioCreator.getTestEvaluationContext();
|
||||||
|
assertFalse(propertyAccessor.canRead(context, null, "abc"));
|
||||||
|
assertFalse(propertyAccessor.canWrite(context, null, "abc"));
|
||||||
|
try {
|
||||||
|
propertyAccessor.read(context, null, "abc");
|
||||||
|
fail("Should have failed with an AccessException");
|
||||||
|
} catch (AccessException ae) {
|
||||||
|
// success
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
propertyAccessor.write(context, null, "abc","foo");
|
||||||
|
fail("Should have failed with an AccessException");
|
||||||
|
} catch (AccessException ae) {
|
||||||
|
// success
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ---
|
||||||
|
|
||||||
private void checkTemplateParsing(String expression, String expectedValue) throws Exception {
|
private void checkTemplateParsing(String expression, String expectedValue) throws Exception {
|
||||||
checkTemplateParsing(expression,TemplateExpressionParsingTests.DEFAULT_TEMPLATE_PARSER_CONTEXT, expectedValue);
|
checkTemplateParsing(expression,TemplateExpressionParsingTests.DEFAULT_TEMPLATE_PARSER_CONTEXT, expectedValue);
|
||||||
}
|
}
|
||||||
|
|
@ -95,7 +108,7 @@ public class SpringEL300Tests extends ExpressionTestCase {
|
||||||
private void checkTemplateParsingError(String expression,ParserContext context, String expectedMessage) throws Exception {
|
private void checkTemplateParsingError(String expression,ParserContext context, String expectedMessage) throws Exception {
|
||||||
SpelAntlrExpressionParser parser = new SpelAntlrExpressionParser();
|
SpelAntlrExpressionParser parser = new SpelAntlrExpressionParser();
|
||||||
try {
|
try {
|
||||||
Expression expr = parser.parseExpression(expression,context);
|
parser.parseExpression(expression,context);
|
||||||
fail("Should have failed");
|
fail("Should have failed");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (!e.getMessage().equals(expectedMessage)) {
|
if (!e.getMessage().equals(expectedMessage)) {
|
||||||
|
|
@ -105,4 +118,17 @@ public class SpringEL300Tests extends ExpressionTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final ParserContext DOLLARSQUARE_TEMPLATE_PARSER_CONTEXT = new ParserContext() {
|
||||||
|
public String getExpressionPrefix() {
|
||||||
|
return "$[";
|
||||||
|
}
|
||||||
|
public String getExpressionSuffix() {
|
||||||
|
return "]";
|
||||||
|
}
|
||||||
|
public boolean isTemplate() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue