【问题标题】:Eclipse Bug - Type mismatch: cannot convert from Class<MatchedArticle> to Class<? extends JsonSerializer<?>>Eclipse 错误 - 类型不匹配:无法从 Class<MatchedArticle> 转换为 Class<?扩展 JsonSerializer<?>>
【发布时间】:2016-05-10 10:19:14
【问题描述】:

我有这样的课:

@JsonSerialize(using=MatchedArticle.class)
public class MatchedArticle extends JsonSerializer<MatchedArticle>{

用maven构建很好,但是Eclipse报如下错误:

类型不匹配:无法从 Class 转换为 Class>

这很奇怪,因为 MatchedArticle 确实扩展了 JsonSerializer

关于如何在 Eclipse 中关闭此精确验证的任何提示?

【问题讨论】:

  • 我现在才遇到这个问题。我试图重现该问题,但无法重现。如果您仍然看到:您使用的是哪个 Eclipse 版本?什么编译器设置(合规性)?
  • 遇到了同样的错误(Jackson @JsonSerialize 也是如此),如果您找到了答案,请与我们分享!

标签: java eclipse


【解决方案1】:

遇到了同样的问题。您可能导入了错误的类/包。

就我而言 我错误地导入了这个

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

而不是这个正确的解决方案

import org.codehaus.jackson.map.annotate.JsonSerialize;

希望这会有所帮助!

【讨论】:

  • 谢谢。这可能解决了我的问题,但我的处理方式不同。如果我有时间,我会研究一下。
【解决方案2】:

如果有人偶然发现这个问题。我还没有尝试过 Vijay 给出的解决方案。首先尝试一下是很自然的。

我通过扩展 SimpleModule 解决了这个问题,并在其中添加了一些嵌套的空 mixin 类。

public class MyModule extends SimpleModule {

      @JsonSerialize(using = ObjectSerializer.class)
      @JsonDeserialize(using = ObjectDeserializer.class)
      public static class ObjectMixin {}

      @JsonSerialize(using = NaturalKeySerializer.class)
      @JsonDeserialize(using = NaturalKeyDeserializer.class)
      public static class NaturalKeyMixin {}

      @JsonSerialize(using = ChangeSerializer.class)
      @JsonDeserialize(using = ChangeDeserializer.class)
      public static class ChangeMixin {}

      @JsonSerialize(using = ViolationSerializer.class)
      public static class ViolationMixin {}
}

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。这是我在一个非常大的项目中的两个课程:

    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 中,或者它使用了语言服务器。

    【讨论】:

      【解决方案4】:

      我在序列化枚举常量时遇到了这个问题。我通过创建自定义模块并向其添加序列化程序、反序列化程序解决了这个问题。

      public enum Month {
       SUNDAY("Sunny Sunday"), MONDAY("Morning Monday"), TUESDAY("Good tuesday"), WEDNESDAY("Happy Wednesday"),
       THURSDAY("Great Tuesday"), FRIDAY("Good Friday"), SATURDAY("Sleepy Saturday");
      
       .....
       .....
      }
      
      public class MonthSerializer extends JsonSerializer<Month> {
      
       @Override
       public void serialize(Month month, JsonGenerator gen, SerializerProvider serializers)
         throws IOException, JsonProcessingException {
         .....
         .....
       }
      
      }
      
      public class MonthDeserializer extends JsonDeserializer<Month> {
      
       @Override
       public Month deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
      
       .....
       .....
       }
      }
      
      public class MonthModule extends SimpleModule{
           private static final long serialVersionUID = 1L;
      
           private static final String NAME = "CustomAddressModule";
           private static final VersionUtil VERSION_UTIL = new VersionUtil() {
           };
      
           public MonthModule() {
                   super(NAME, VERSION_UTIL.version());
                   addSerializer(Month.class, new MonthSerializer());
                   addDeserializer(Month.class, new MonthDeserializer());
           }
      }
      

      定义 MonthModule 后,将其注册到 ObjectMapper。

      ObjectMapper mapper = new ObjectMapper();
      mapper.registerModule(new MonthModule());
      

      引用link

      【讨论】:

        猜你喜欢
        • 2018-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-19
        • 1970-01-01
        • 2020-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多