/** * Create a new BeanNotOfRequiredTypeException. * @param beanName the name of the bean requested * @param requiredType the required type * @param actualType the actual type returned, which did not match * the expected type */ public BeanNotOfRequiredTypeException(String beanName, Class<?> requiredType, Class<?> actualType) { super("Bean named '" + beanName + "' is expected to be of type '" + ClassUtils.getQualifiedName(requiredType) + "' but was actually of type '" + ClassUtils.getQualifiedName(actualType) + "'"); this.beanName = beanName; this.requiredType = requiredType; this.actualType = actualType; }
/** * Determine a readable name for a given Class object. * <p>A String array will have the formatted name "java.lang.String[]". * @param clazz the Class whose name is to be formatted * @return a formatted String suitable for message inclusion * @see ClassUtils#getQualifiedName(Class) */ public static String formatClassNameForMessage(@Nullable Class<?> clazz) { return (clazz != null ? ClassUtils.getQualifiedName(clazz) : "null"); }
/** * Get the class name without the qualified package name. * @param clazz the class to get the short name for * @return the class name of the class without the package name */ public static String getShortName(Class<?> clazz) { return getShortName(getQualifiedName(clazz)); }
/** * Return the name of this type: the fully qualified class name. */ public String getName() { return ClassUtils.getQualifiedName(getType()); }
@Override public String getAsText() { Class<?> clazz = (Class<?>) getValue(); if (clazz != null) { return ClassUtils.getQualifiedName(clazz); } else { return ""; } }
@Override public String getAsText() { Class<?>[] classes = (Class[]) getValue(); if (ObjectUtils.isEmpty(classes)) { return ""; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < classes.length; ++i) { if (i > 0) { sb.append(","); } sb.append(ClassUtils.getQualifiedName(classes[i])); } return sb.toString(); }
/** * Create a new {@code TypeMismatchException} without a {@code PropertyChangeEvent}. * @param value the offending value that couldn't be converted (may be {@code null}) * @param requiredType the required target type (or {@code null} if not known) * @param cause the root cause (may be {@code null}) * @see #initPropertyName */ public TypeMismatchException(@Nullable Object value, @Nullable Class<?> requiredType, @Nullable Throwable cause) { super("Failed to convert value of type '" + ClassUtils.getDescriptiveType(value) + "'" + (requiredType != null ? " to required type '" + ClassUtils.getQualifiedName(requiredType) + "'" : ""), cause); this.value = value; this.requiredType = requiredType; }
/** * Create a new {@code TypeMismatchException}. * @param propertyChangeEvent the PropertyChangeEvent that resulted in the problem * @param requiredType the required target type (or {@code null} if not known) * @param cause the root cause (may be {@code null}) */ public TypeMismatchException(PropertyChangeEvent propertyChangeEvent, @Nullable Class<?> requiredType, @Nullable Throwable cause) { super(propertyChangeEvent, "Failed to convert property value of type '" + ClassUtils.getDescriptiveType(propertyChangeEvent.getNewValue()) + "'" + (requiredType != null ? " to required type '" + ClassUtils.getQualifiedName(requiredType) + "'" : "") + (propertyChangeEvent.getPropertyName() != null ? " for property '" + propertyChangeEvent.getPropertyName() + "'" : ""), cause); this.propertyName = propertyChangeEvent.getPropertyName(); this.value = propertyChangeEvent.getNewValue(); this.requiredType = requiredType; }
/** * Get the class name without the qualified package name. * @param clazz the class to get the short name for * @return the class name of the class without the package name */ public static String getShortName(Class<?> clazz) { return getShortName(getQualifiedName(clazz)); }
@Override public String getAsText() { Class<?> clazz = (Class<?>) getValue(); if (clazz != null) { return ClassUtils.getQualifiedName(clazz); } else { return ""; } }
/** * Return the name of this type: the fully qualified class name. */ public String getName() { return ClassUtils.getQualifiedName(getType()); }
/** * Create a new {@code TypeMismatchException} without a {@code PropertyChangeEvent}. * @param value the offending value that couldn't be converted (may be {@code null}) * @param requiredType the required target type (or {@code null} if not known) * @param cause the root cause (may be {@code null}) * @see #initPropertyName */ public TypeMismatchException(@Nullable Object value, @Nullable Class<?> requiredType, @Nullable Throwable cause) { super("Failed to convert value of type '" + ClassUtils.getDescriptiveType(value) + "'" + (requiredType != null ? " to required type '" + ClassUtils.getQualifiedName(requiredType) + "'" : ""), cause); this.value = value; this.requiredType = requiredType; }
private String appendPayload(Object payload) { if (payload.getClass() != byte[].class) { throw new IllegalStateException( "Expected byte array payload but got: " + ClassUtils.getQualifiedName(payload.getClass())); } byte[] bytes = (byte[]) payload; MimeType mimeType = getContentType(); String contentType = (mimeType != null ? " " + mimeType.toString() : ""); if (bytes.length == 0 || mimeType == null || !isReadableContentType()) { return contentType; } Charset charset = mimeType.getCharset(); charset = (charset != null ? charset : StandardCharsets.UTF_8); return (bytes.length < 80) ? contentType + " payload=" + new String(bytes, charset) : contentType + " payload=" + new String(Arrays.copyOf(bytes, 80), charset) + "...(truncated)"; }
@Override public Object resolveArgument(MethodParameter parameter, Message<?> message) throws Exception { Class<?> targetMessageType = parameter.getParameterType(); Class<?> targetPayloadType = getPayloadType(parameter); if (!targetMessageType.isAssignableFrom(message.getClass())) { throw new MethodArgumentTypeMismatchException(message, parameter, "Actual message type '" + ClassUtils.getDescriptiveType(message) + "' does not match expected type '" + ClassUtils.getQualifiedName(targetMessageType) + "'"); } Object payload = message.getPayload(); if (targetPayloadType.isInstance(payload)) { return message; } if (isEmptyPayload(payload)) { throw new MessageConversionException(message, "Cannot convert from actual payload type '" + ClassUtils.getDescriptiveType(payload) + "' to expected payload type '" + ClassUtils.getQualifiedName(targetPayloadType) + "' when payload is empty"); } payload = convertPayload(message, parameter, targetPayloadType); return MessageBuilder.createMessage(payload, message.getHeaders()); }
private Object convertPayload(Message<?> message, MethodParameter parameter, Class<?> targetPayloadType) { Object result = null; if (this.converter instanceof SmartMessageConverter) { SmartMessageConverter smartConverter = (SmartMessageConverter) this.converter; result = smartConverter.fromMessage(message, targetPayloadType, parameter); } else if (this.converter != null) { result = this.converter.fromMessage(message, targetPayloadType); } if (result == null) { throw new MessageConversionException(message, "No converter found from actual payload type '" + ClassUtils.getDescriptiveType(message.getPayload()) + "' to expected payload type '" + ClassUtils.getQualifiedName(targetPayloadType) + "'"); } return result; }
@Test public void testGetQualifiedName() { String className = ClassUtils.getQualifiedName(getClass()); assertEquals("Class name did not match", "org.springframework.util.ClassUtilsTests", className); }
@Test public void testGetQualifiedNameForMultiDimensionalObjectArrayClass() { String className = ClassUtils.getQualifiedName(Object[][].class); assertEquals("Class name did not match", "java.lang.Object[][]", className); }
@Test public void testGetQualifiedNameForObjectArrayClass() { String className = ClassUtils.getQualifiedName(Object[].class); assertEquals("Class name did not match", "java.lang.Object[]", className); }
@Test public void testGetQualifiedNameForPrimitiveArrayClass() { String className = ClassUtils.getQualifiedName(byte[].class); assertEquals("Class name did not match", "byte[]", className); }
@Test public void testGetQualifiedNameForMultiDimensionalPrimitiveArrayClass() { String className = ClassUtils.getQualifiedName(byte[][].class); assertEquals("Class name did not match", "byte[][]", className); }