我遇到了同样的问题。这是我在一个非常大的项目中的两个课程:
package ws.daley.hollow.validation;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordMatchesValidator.class)
@Documented
public @interface PasswordMatches
{
String message() default "Passwords don't match";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
和
package ws.daley.hollow.validation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import ws.daley.hollow.persistence.admin.model.User;
import ws.daley.hollow.web.admin.dto.UserDto;
public class PasswordMatchesValidator implements ConstraintValidator<PasswordMatches, Object>
{
@Override
public void initialize(@SuppressWarnings("unused") final PasswordMatches constraintAnnotation) {/* */}
@Override
public boolean isValid(final Object obj, final ConstraintValidatorContext context)
{
@SuppressWarnings("unchecked")
final UserDto<User> user = (UserDto<User>) obj;
return user.getPassword().equals(user.getMatchingPassword());
}
}
PasswordMatches 中的以下行
@Constraint(validatedBy = PasswordMatchesValidator.class)
得到错误:
Type mismatch: cannot convert from Class<PasswordMatchesValidator> to Class<? extends ConstraintValidator<?,?>>[]
代码在STS4内外的maven下都能正常构建。
我找到了一个临时(并且非常短暂)的解决方案来解决这个问题。只需将 PasswordMatches 源代码复制到剪贴板,从项目中删除 PasswordMatches 类,添加一个同名的新类,将复制的代码粘贴回去,保存并构建。问题现在消失了,但只是暂时的。一段时间后,显然某些随机事件会导致完全相同的错误再次出现在完全相同的位置。上述操作再次解决了问题。
我在 Eclipse 上运行 STS4。在我从 JDK8 升级到 JDK10 和从 STS3 升级到 STS4 之前,这个问题并没有出现,尽管这可能是轶事。我怀疑问题出在新的 eclipse/STS4 中,或者它使用了语言服务器。