From 47a7475898fc918e2f945206e3364bdaab2bb39f Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 18 Aug 2017 00:15:46 +0200 Subject: [PATCH] Resolve remaining nullability warnings Issue: SPR-15869 --- .../aop/target/CommonsPool2TargetSource.java | 18 ++++++--- .../jdbc/core/JdbcTemplate.java | 14 +++---- .../NamedParameterJdbcTemplate.java | 8 +++- .../adapter/MessageListenerAdapter.java | 5 --- .../adapter/MessageListenerAdapterTests.java | 37 +------------------ .../org/springframework/http/MediaType.java | 2 +- .../AbstractNameValueExpression.java | 37 +++++++++++-------- .../condition/HeadersRequestCondition.java | 6 +-- .../condition/ParamsRequestCondition.java | 5 ++- .../result/view/DefaultRendering.java | 1 + .../web/reactive/result/view/Rendering.java | 1 + 11 files changed, 54 insertions(+), 80 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/target/CommonsPool2TargetSource.java b/spring-aop/src/main/java/org/springframework/aop/target/CommonsPool2TargetSource.java index 3e8183be21..d0f891c8b8 100644 --- a/spring-aop/src/main/java/org/springframework/aop/target/CommonsPool2TargetSource.java +++ b/spring-aop/src/main/java/org/springframework/aop/target/CommonsPool2TargetSource.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 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. @@ -24,6 +24,7 @@ import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.springframework.lang.Nullable; +import org.springframework.util.Assert; /** * {@link org.springframework.aop.TargetSource} implementation that holds @@ -230,6 +231,7 @@ public class CommonsPool2TargetSource extends AbstractPoolingTargetSource implem */ @Override public Object getTarget() throws Exception { + Assert.state(this.pool != null, "No Commons ObjectPool available"); return this.pool.borrowObject(); } @@ -238,17 +240,19 @@ public class CommonsPool2TargetSource extends AbstractPoolingTargetSource implem */ @Override public void releaseTarget(Object target) throws Exception { - this.pool.returnObject(target); + if (this.pool != null) { + this.pool.returnObject(target); + } } @Override public int getActiveCount() throws UnsupportedOperationException { - return this.pool.getNumActive(); + return (this.pool != null ? this.pool.getNumActive() : 0); } @Override public int getIdleCount() throws UnsupportedOperationException { - return this.pool.getNumIdle(); + return (this.pool != null ? this.pool.getNumIdle() : 0); } @@ -257,8 +261,10 @@ public class CommonsPool2TargetSource extends AbstractPoolingTargetSource implem */ @Override public void destroy() throws Exception { - logger.debug("Closing Commons ObjectPool"); - this.pool.close(); + if (this.pool != null) { + logger.debug("Closing Commons ObjectPool"); + this.pool.close(); + } } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java index bb0ee33895..9b498666ae 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java @@ -446,14 +446,12 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { @Override public List query(String sql, RowMapper rowMapper) throws DataAccessException { - List result = query(sql, new RowMapperResultSetExtractor<>(rowMapper)); - Assert.state(result != null, "No result list"); - return result; + return nonNull(query(sql, new RowMapperResultSetExtractor<>(rowMapper))); } @Override public Map queryForMap(String sql) throws DataAccessException { - return queryForObject(sql, getColumnMapRowMapper()); + return nonNull(queryForObject(sql, getColumnMapRowMapper())); } @Override @@ -481,9 +479,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { @Override public SqlRowSet queryForRowSet(String sql) throws DataAccessException { - SqlRowSet result = query(sql, new SqlRowSetResultSetExtractor()); - Assert.state(result != null, "No SqlRowSet"); - return result; + return nonNull(query(sql, new SqlRowSetResultSetExtractor())); } @Override @@ -798,12 +794,12 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { @Override public Map queryForMap(String sql, Object[] args, int[] argTypes) throws DataAccessException { - return queryForObject(sql, args, argTypes, getColumnMapRowMapper()); + return nonNull(queryForObject(sql, args, argTypes, getColumnMapRowMapper())); } @Override public Map queryForMap(String sql, @Nullable Object... args) throws DataAccessException { - return queryForObject(sql, args, getColumnMapRowMapper()); + return nonNull(queryForObject(sql, args, getColumnMapRowMapper())); } @Override diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java index f66cc65033..351c1c38f9 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.java @@ -246,12 +246,16 @@ public class NamedParameterJdbcTemplate implements NamedParameterJdbcOperations @Override public Map queryForMap(String sql, SqlParameterSource paramSource) throws DataAccessException { - return queryForObject(sql, paramSource, new ColumnMapRowMapper()); + Map result = queryForObject(sql, paramSource, new ColumnMapRowMapper()); + Assert.state(result != null, "No result map"); + return result; } @Override public Map queryForMap(String sql, Map paramMap) throws DataAccessException { - return queryForObject(sql, paramMap, new ColumnMapRowMapper()); + Map result = queryForObject(sql, paramMap, new ColumnMapRowMapper()); + Assert.state(result != null, "No result map"); + return result; } @Override diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessageListenerAdapter.java b/spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessageListenerAdapter.java index ff44538b8c..2486452530 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessageListenerAdapter.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/adapter/MessageListenerAdapter.java @@ -216,11 +216,6 @@ public class MessageListenerAdapter extends AbstractAdaptableMessageListener imp // Regular case: find a handler method reflectively. Object convertedMessage = extractMessage(message); String methodName = getListenerMethodName(message, convertedMessage); - if (methodName == null) { - throw new javax.jms.IllegalStateException("No default listener method specified: " + - "Either specify a non-null value for the 'defaultListenerMethod' property or " + - "override the 'getListenerMethodName' method."); - } // Invoke the handler method with appropriate arguments. Object[] listenerArguments = buildListenerArguments(convertedMessage); diff --git a/spring-jms/src/test/java/org/springframework/jms/listener/adapter/MessageListenerAdapterTests.java b/spring-jms/src/test/java/org/springframework/jms/listener/adapter/MessageListenerAdapterTests.java index d085341efb..9ee339480e 100644 --- a/spring-jms/src/test/java/org/springframework/jms/listener/adapter/MessageListenerAdapterTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/listener/adapter/MessageListenerAdapterTests.java @@ -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. @@ -19,7 +19,6 @@ package org.springframework.jms.listener.adapter; import java.io.ByteArrayInputStream; import java.io.Serializable; import javax.jms.BytesMessage; -import javax.jms.IllegalStateException; import javax.jms.InvalidDestinationException; import javax.jms.JMSException; import javax.jms.Message; @@ -377,40 +376,6 @@ public class MessageListenerAdapterTests { catch (ListenerExecutionFailedException ex) { /* expected */ } } - @Test - public void testFailsIfNoDefaultListenerMethodNameIsSupplied() throws Exception { - final TextMessage message = mock(TextMessage.class); - given(message.getText()).willReturn(TEXT); - - final MessageListenerAdapter adapter = new MessageListenerAdapter() { - @Override - protected void handleListenerException(Throwable ex) { - assertTrue(ex instanceof IllegalStateException); - } - }; - adapter.setDefaultListenerMethod(null); - adapter.onMessage(message); - } - - @Test - public void testFailsWhenOverriddenGetListenerMethodNameReturnsNull() throws Exception { - final TextMessage message = mock(TextMessage.class); - given(message.getText()).willReturn(TEXT); - - final MessageListenerAdapter adapter = new MessageListenerAdapter() { - @Override - protected void handleListenerException(Throwable ex) { - assertTrue(ex instanceof javax.jms.IllegalStateException); - } - @Override - protected String getListenerMethodName(Message originalMessage, Object extractedMessage) { - return null; - } - }; - adapter.setDefaultListenerMethod(null); - adapter.onMessage(message); - } - @Test public void testWithResponsiveMessageDelegateWhenReturnTypeIsNotAJMSMessageAndNoMessageConverterIsSupplied() throws Exception { final TextMessage sentTextMessage = mock(TextMessage.class); diff --git a/spring-web/src/main/java/org/springframework/http/MediaType.java b/spring-web/src/main/java/org/springframework/http/MediaType.java index 1fdb0be74b..ca3c705813 100644 --- a/spring-web/src/main/java/org/springframework/http/MediaType.java +++ b/spring-web/src/main/java/org/springframework/http/MediaType.java @@ -525,7 +525,7 @@ public class MediaType extends MimeType implements Serializable { * @return the list of media types * @throws InvalidMediaTypeException if the media type value cannot be parsed */ - public static List parseMediaTypes(String mediaTypes) { + public static List parseMediaTypes(@Nullable String mediaTypes) { if (!StringUtils.hasLength(mediaTypes)) { return Collections.emptyList(); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/AbstractNameValueExpression.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/AbstractNameValueExpression.java index 071929c7bd..68581cafc9 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/AbstractNameValueExpression.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/AbstractNameValueExpression.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 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. @@ -17,6 +17,7 @@ package org.springframework.web.reactive.result.condition; import org.springframework.lang.Nullable; +import org.springframework.util.ObjectUtils; import org.springframework.web.server.ServerWebExchange; /** @@ -36,20 +37,22 @@ abstract class AbstractNameValueExpression implements NameValueExpression protected final boolean isNegated; + AbstractNameValueExpression(String expression) { int separator = expression.indexOf('='); if (separator == -1) { this.isNegated = expression.startsWith("!"); - this.name = isNegated ? expression.substring(1) : expression; + this.name = (this.isNegated ? expression.substring(1) : expression); this.value = null; } else { this.isNegated = (separator > 0) && (expression.charAt(separator - 1) == '!'); - this.name = isNegated ? expression.substring(0, separator - 1) : expression.substring(0, separator); + this.name = (this.isNegated ? expression.substring(0, separator - 1) : expression.substring(0, separator)); this.value = parseValue(expression.substring(separator + 1)); } } + @Override public String getName() { return this.name; @@ -66,10 +69,6 @@ abstract class AbstractNameValueExpression implements NameValueExpression return this.isNegated; } - protected abstract boolean isCaseSensitiveName(); - - protected abstract T parseValue(String valueExpression); - public final boolean match(ServerWebExchange exchange) { boolean isMatch; if (this.value != null) { @@ -81,10 +80,16 @@ abstract class AbstractNameValueExpression implements NameValueExpression return this.isNegated != isMatch; } + + protected abstract boolean isCaseSensitiveName(); + + protected abstract T parseValue(String valueExpression); + protected abstract boolean matchName(ServerWebExchange exchange); protected abstract boolean matchValue(ServerWebExchange exchange); + @Override public boolean equals(Object obj) { if (this == obj) { @@ -103,28 +108,28 @@ abstract class AbstractNameValueExpression implements NameValueExpression @Override public int hashCode() { - int result = isCaseSensitiveName() ? name.hashCode() : name.toLowerCase().hashCode(); - result = 31 * result + (value != null ? value.hashCode() : 0); - result = 31 * result + (isNegated ? 1 : 0); + int result = (isCaseSensitiveName() ? this.name : this.name.toLowerCase()).hashCode(); + result = 31 * result + ObjectUtils.nullSafeHashCode(this.value); + result = 31 * result + (this.isNegated ? 1 : 0); return result; } @Override public String toString() { StringBuilder builder = new StringBuilder(); - if (value != null) { - builder.append(name); - if (isNegated) { + if (this.value != null) { + builder.append(this.name); + if (this.isNegated) { builder.append('!'); } builder.append('='); - builder.append(value); + builder.append(this.value); } else { - if (isNegated) { + if (this.isNegated) { builder.append('!'); } - builder.append(name); + builder.append(this.name); } return builder.toString(); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/HeadersRequestCondition.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/HeadersRequestCondition.java index c29fe70ead..93d42efc12 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/HeadersRequestCondition.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/HeadersRequestCondition.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 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. @@ -159,12 +159,12 @@ public final class HeadersRequestCondition extends AbstractRequestCondition