Consistent use of @Nullable across the codebase (even for internals)
Beyond just formally declaring the current behavior, this revision actually enforces non-null behavior in selected signatures now, not tolerating null values anymore when not explicitly documented. It also changes some utility methods with historic null-in/null-out tolerance towards enforced non-null return values, making them a proper citizen in non-null assignments. Some issues are left as to-do: in particular a thorough revision of spring-test, and a few tests with unclear failures (ignored as "TODO: NULLABLE") to be sorted out in a follow-up commit. Issue: SPR-15540
This commit is contained in:
@@ -244,6 +244,7 @@ public class EvaluationTests extends AbstractExpressionTests {
|
||||
fail("Should have failed to parse");
|
||||
}
|
||||
catch (ParseException e) {
|
||||
e.printStackTrace();
|
||||
assertTrue(e instanceof SpelParseException);
|
||||
SpelParseException spe = (SpelParseException) e;
|
||||
assertEquals(SpelMessage.OOD, spe.getMessageCode());
|
||||
|
||||
@@ -262,7 +262,7 @@ public class ExpressionStateTests extends AbstractExpressionTests {
|
||||
@Test
|
||||
public void testTypeConversion() throws EvaluationException {
|
||||
ExpressionState state = getState();
|
||||
String s = (String)state.convertValue(34, TypeDescriptor.valueOf(String.class));
|
||||
String s = (String) state.convertValue(34, TypeDescriptor.valueOf(String.class));
|
||||
assertEquals("34",s);
|
||||
|
||||
s = (String)state.convertValue(new TypedValue(34), TypeDescriptor.valueOf(String.class));
|
||||
|
||||
@@ -62,7 +62,8 @@ public class SetValueTests extends AbstractExpressionTests {
|
||||
|
||||
@Test
|
||||
public void testSetElementOfNull() {
|
||||
setValueExpectError("new org.springframework.expression.spel.testresources.Inventor().inventions[1]",SpelMessage.CANNOT_INDEX_INTO_NULL_VALUE);
|
||||
setValueExpectError("new org.springframework.expression.spel.testresources.Inventor().inventions[1]",
|
||||
SpelMessage.CANNOT_INDEX_INTO_NULL_VALUE);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -474,7 +474,7 @@ public class SpelCompilationCoverageTests extends AbstractExpressionTests {
|
||||
expression = parser.parseExpression("T(Integer).valueOf(42)");
|
||||
expression.getValue(Integer.class);
|
||||
assertCanCompile(expression);
|
||||
assertEquals(new Integer(42), expression.getValue(null, Integer.class));
|
||||
assertEquals(new Integer(42), expression.getValue(new StandardEvaluationContext(), Integer.class));
|
||||
|
||||
// Code gen is different for -1 .. 6 because there are bytecode instructions specifically for those
|
||||
// values
|
||||
|
||||
@@ -360,16 +360,16 @@ public class SpelReproTests extends AbstractExpressionTests {
|
||||
assertFalse(propertyAccessor.canWrite(context, null, "abc"));
|
||||
try {
|
||||
propertyAccessor.read(context, null, "abc");
|
||||
fail("Should have failed with an AccessException");
|
||||
fail("Should have failed with an IllegalStateException");
|
||||
}
|
||||
catch (AccessException ae) {
|
||||
catch (IllegalStateException ae) {
|
||||
// success
|
||||
}
|
||||
try {
|
||||
propertyAccessor.write(context, null, "abc", "foo");
|
||||
fail("Should have failed with an AccessException");
|
||||
fail("Should have failed with an AccessEIllegalStateExceptionxception");
|
||||
}
|
||||
catch (AccessException ae) {
|
||||
catch (IllegalStateException ae) {
|
||||
// success
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2013 the original author or authors.
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -213,23 +213,21 @@ public class TemplateExpressionParsingTests extends AbstractExpressionTests {
|
||||
// Just wanting to use the prefix or suffix within the template:
|
||||
Expression ex = parser.parseExpression("hello ${3+4} world",DEFAULT_TEMPLATE_PARSER_CONTEXT);
|
||||
String s = ex.getValue(TestScenarioCreator.getTestEvaluationContext(),String.class);
|
||||
assertEquals("hello 7 world",s);
|
||||
assertEquals("hello 7 world", s);
|
||||
|
||||
ex = parser.parseExpression("hello ${3+4} wo${'${'}rld",DEFAULT_TEMPLATE_PARSER_CONTEXT);
|
||||
s = ex.getValue(TestScenarioCreator.getTestEvaluationContext(),String.class);
|
||||
assertEquals("hello 7 wo${rld",s);
|
||||
assertEquals("hello 7 wo${rld", s);
|
||||
|
||||
ex = parser.parseExpression("hello ${3+4} wo}rld",DEFAULT_TEMPLATE_PARSER_CONTEXT);
|
||||
s = ex.getValue(TestScenarioCreator.getTestEvaluationContext(),String.class);
|
||||
assertEquals("hello 7 wo}rld",s);
|
||||
assertEquals("hello 7 wo}rld", s);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParsingNormalExpressionThroughTemplateParser() throws Exception {
|
||||
Expression expr = parser.parseExpression("1+2+3");
|
||||
assertEquals(6,expr.getValue());
|
||||
expr = parser.parseExpression("1+2+3",null);
|
||||
assertEquals(6,expr.getValue());
|
||||
assertEquals(6, expr.getValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user