Компаратор выдает странное ClassCastException: pkg.MyClass не может быть приведен к pkg.MyClass - PullRequest
1 голос
/ 23 сентября 2011

Я использую Comparator для сортировки List<Entity> по его свойству (типа Date) в управляемом bean-объекте видимости.

Проблема в том, что я продолжаю получать ClassCastException следующим образом -

java.lang.ClassCastException: pkg.db.BaseArStatus не может быть приведен к pkg.db.BaseArStatus.

Почему он не может разыграть BaseArStatus на BaseArStatus? Это потому что BaseArStatus это Entity?

Проблема действительно странная для меня, потому что я не получаю исключение каждый раз . Большинство из них работает нормально (работает без проблем) при сборке и развертывании приложения, но иногда (даже если я делаю то же самое - сборка и развертывание) происходит сбой во время выполнения с ClassCastException.

Почему это происходит только иногда , а не постоянно? Это потому, что я использую его в управляемом бине?

Вот так выглядит управляемый бин -

@ManagedBean
@ViewScoped
public class MyBean {

@PersistenceContext(unitName = "myPU")
private EntityManager em;

public void myMethod() {
    List<BaseArStatus> basList = this.fetchAllBaseArStatus();
    Collections.sort(basList, new Comparator<BaseArStatus>() {
        @Override
        public int compare(BaseArStatus o1, BaseArStatus o2) {
            return o1.getMonthDate().compareTo(o2.getMonthDate());
        }
    });
//...

А сущность BaseArStatus -

@Entity
@Table(name = "base_ar_status")
@NamedQueries({
    @NamedQuery(name = "BaseArStatus.findAll", query = "SELECT b FROM BaseArStatus b")})
public class BaseArStatus implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Column(name = "month_date")
    @Temporal(TemporalType.DATE)
    private Date monthDate;
    @Basic(optional = false)
    @NotNull
    @Column(name = "ar_count")
    private double arCount;
    @Size(max = 50)
    @Column(name = "user_id")
    private String userId;
    @Column(name = "last_update_date")
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdateDate;

    public BaseArStatus() { }
//...

Ответы [ 2 ]

5 голосов
/ 23 сентября 2011

Два разных загрузчика классов загружают две разные копии класса. Когда клиентский код, знакомый с одной копией класса, получает объект, который является экземпляром другой копии класса, это то, что вы получаете.

Проблема возникнет, только если класс был загружен обоими загрузчиками классов. Это может заставить это казаться прерывистым; В зависимости от событий, которые вы часто не можете контролировать, один из загрузчиков классов может загружать или не загружать класс. По моему опыту, это проблема, наиболее часто встречающаяся в программировании на Java EE, что, конечно, то, что вы делаете.

0 голосов
/ 23 сентября 2011

Определенно звучит как сравнение между классами, загруженными разными ClassLoaders.Вы можете использовать метод Class.getClassLoader (), чтобы подтвердить это для нас.Перехватите исключение и напечатайте, действительно ли classA.getClassLoader () == classB.getClassLoader ().

...