2012-03-08 30 views
13

Tôi nhận được lỗi sau khi nó cố gắng để tạo ra một thể hiện của 'Transacao'xStream không args constructor lỗi

`Error: Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor : Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor ` 

---- Debugging information ---- 

message : Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor 

cause-exception : com.thoughtworks.xstream.converters.reflection.ObjectAccessException 

cause-message : Cannot construct br.com.cbmp.ecommerce.resposta.Transacao as it does not have a no-args constructor ` 

class : br.com.cbmp.ecommerce.resposta.Transacao 

required-type : br.com.cbmp.ecommerce.resposta.Transacao 

path : /transacao 

Tôi biết rằng có một lỗi với XStream 1.3.1 và JDK7, nhưng Tôi hiện đang sử dụng XStream 1.3.1 và JDK6. Bất kỳ ý tưởng nào tại sao lỗi này vẫn đang xảy ra?

Cảm ơn

+1

Lớp học của bạn có một nhà xây dựng phi arg không? Nếu bạn không viết một constructor, nó sử dụng constructor no-arg từ 'Object' nhưng nếu bạn viết một constructor thì nó không phải do đó bạn phải cung cấp constructor no-arg của riêng bạn. – twain249

+0

@ twain249 lớp thực sự có một nhà xây dựng với các đối số, mang lại cho tôi câu hỏi: tôi có thực sự phải tạo ra một constructor no-arg không? Tôi cần phải vượt qua các tham số, nếu không lớp sẽ không hoạt động.Nếu thêm constructor no-arg, nó sẽ gọi hàm khởi tạo này và đối tượng sẽ không đầy đủ, kết quả là một NullPointerException –

+1

Tôi đã có một vấn đề tương tự một chút trước đây với một dự án Web động muốn tôi định nghĩa một hàm tạo không-arg và một khi tôi đã làm mọi thứ dường như hoạt động. Tôi không biết chính xác lý do tại sao nó được yêu cầu (tôi giả định khi dịch vụ REST cố gắng tạo ra một phản hồi mà không có dữ liệu được gọi mặc định) nhưng theo tôi có thể nói nó không ảnh hưởng đến hiệu suất của mã của tôi. Tất cả những gì tôi đã làm trong constructor được gọi là 'super() ' – twain249

Trả lời

5

Câu trả lời đơn giản: tất cả các lớp bên trong của bạn phải được đánh dấu là tĩnh hoặc bạn nên sử dụng đầy đủ, ví dụ: không phải lớp bên trong.

Câu trả lời dài: Java thực hiện một số thao tác tự động và bạn đã gặp phải trường hợp cạnh (Xem here). Đó là (chủ yếu) là không thể cho một lớp bên trong để có một constructor no-args. Java luôn thêm một đối số cho bất kỳ hàm tạo nào trong một lớp bên trong/cục bộ và đối số đó là tham chiếu đến lớp cha. Điều này được sử dụng để bạn có thể truy cập tất cả các biến/phương thức của cha, nhưng có nghĩa là ngay cả một hàm tạo không có (trong mã) có (khi sử dụng sự phản chiếu, giống như xstream) một đối số. Để khắc phục, đánh dấu lớp là tĩnh để nó không còn yêu cầu kế thừa tất cả các phương thức/biến lớp cha.

+1

+1 Cảm ơn câu trả lời dài, tốt để biết tại sao mọi thứ lại xảy ra thay vì chỉ giải quyết chúng. Cũng đã giải quyết được vấn đề của tôi. – RyanfaeScotland

+1

Tôi đã nâng cấp lên XStream 1.4.4 như JRL đã nói không hoạt động, nhưng điều này làm việc cho tôi, Cảm ơn bạn @Hamy – praveenb

17

3 giải pháp:

  1. Cung cấp một không-args constructor (rõ ràng)
  2. Làm cho đối tượng này thực hiện Serializable.
  3. Nâng cấp lên luồng 1.4.4 *

Tôi sử dụng giải pháp # 2 mọi lúc.

* Tôi xác nhận 1.2.2 không hoạt động và 1.4.4 không làm việc, đã không cố gắng bất kỳ phiên bản ở giữa

+0

Tôi đang sử dụng XStream 1.4.4 với JDK6 và tôi có vấn đề tương tự. Tôi không thể sử dụng giải pháp 1 hoặc 2. Bất kỳ ý tưởng nào khác? – cadavre

2

tôi đã có thể sửa chữa một thông báo lỗi tương tự bằng cách cập nhật XStream 1.4.4 Bây giờ nó là jdk7 thân thiện hơn. Trong trường hợp cụ thể của tôi (thậm chí là odder) nó sẽ thất bại trong trình soạn thảo, và thành công trên dòng lệnh. Hóa ra dòng lệnh của tôi đã sử dụng jdk6, trình soạn thảo đang sử dụng jdk7. Đi con số.

ref: http://xstream.10960.n7.nabble.com/JAVA-7-compatibility-problem-td7172.html

2

XStream 1.3.1 không hỗ trợ nữa deserialization dưới JDK 1.7 nếu không có constructor không arg.

Độ phân giải:

1) Để giải quyết vấn đề này, bạn cần sử dụng JDK6 nếu bạn muốn tiếp tục với 1.3.1 jar.

2) Nếu bạn sử dụng JDK7 hoặc mới hơn thì để giải quyết vấn đề này, bạn cần nâng cấp JAR xstream.jar 1.3.1 để phát hành sau này.

Để biết thêm chi tiết, vui lòng tham khảo https://jira.atlassian.com/browse/JRA-32823.

Các vấn đề liên quan