I see that using deprecation annotation isn't forcing/warning if user doesn't add link to the new item:
The ability to deprecate a class, method, or member field solves the problem. Java supports two mechanisms for deprecation: and an annotation, (supported starting with J2SE 5.0) and a Javadoc tag (supported since 1.1). Existing calls to the old API continue to work, but the annotation causes the compiler to issue a warning when it finds references to deprecated program elements. The Javadoc tag and associated comments warn users against using the deprecated item and tell them what to use instead
Also specify in @deprecated oracle docs
The @deprecated description in the first sentence should at least tell the user when the API was deprecated and what to use as a replacement.
But the replacement isn't forced or warns about its absent
For example Apache's StringEscapeUtils doesn't specify replacement in several cases
public static final String escapeJava(String input)
Deprecated.
Escapes the characters in a String using Java String rules....
Or direct to other deprecated methods
public static final String escapeXml(String input)
Deprecated.
use escapeXml10(java.lang.String) or escapeXml11(java.lang.String) instead.
Is there any way/tool that can warns if it doesn't state what is my (valid) substitute solution for deprecated method/class?
Side note: docs also offer how to ignore a missing replacement:
If the member has no replacement, the argument to @deprecated should be "No replacement".