Eclipse Bug - 类型不匹配:无法从Class <matchedarticle>转换为Class <! - ?扩展JsonSerializer <? - >&gt;

时间:2016-05-10 10:19:15

标签: java eclipse

我有一个这样的课程:

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

它使用maven构建良好,但Eclipse报告以下错误:

  

类型不匹配:无法转换为Class&lt; MatchedArticle&gt;到班级&lt;?扩展了JsonSerializer&lt;?&gt;&gt;

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

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

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

希望这有帮助!

答案 1 :(得分:0)

万一有人偶然发现了这个问题。我还没有尝试过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 {}
}

答案 2 :(得分:0)

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

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还是使用语言服务器。

答案 3 :(得分:0)

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

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());

Referene link