2016-10-26 6 views
0

У меня есть два класса.Xstream XML to Java с ошибкой Classcast

XClass1

@XStreamAlias("reply") 
    public class XClass1 { 

    @XStreamAlias("message") 
    private String message; 

    public String getMessage() { 
     return message; 
    } 

    } 

XClass2

@XStreamAlias("reply") 
    public class XClass2 { 

    @XStreamAlias("status") 
    private String status; 

    public String getStatus() { 
     return status; 
    } 

    } 

Я использую XSTREAM для преобразования XML в Java

@Test 
    public void test() { 
    XStream stream = new XStream() { 
     @Override 
     protected MapperWrapper wrapMapper(MapperWrapper next) { 
     return new MapperWrapper(next) { 
      @Override 
      public boolean shouldSerializeMember(@SuppressWarnings("rawtypes") Class definedIn, String fieldName) { 
      if (definedIn == Object.class) 
       return false; 

      return super.shouldSerializeMember(definedIn, fieldName); 
      } 
     }; 
     } 
    }; 
    stream.autodetectAnnotations(true); 
    stream.processAnnotations(new Class[] {XClass1.class, XClass2.class}); 

    String reply = "<reply><message>Not OK</message></reply>"; 
    XClass1 lass1 = (XClass1) stream.fromXML(reply); 

    String reply2 = "<reply><status>Not OK</status></reply>"; 
    XClass2 lass2 = (XClass2) stream.fromXML(reply2); 
    } 

я получаю исключение класс произнесения при преобразовании XML в Java

Ошибка в этом месте

XClass1 lass1 = (XClass1) stream.fromXML(reply); 

Исключение

java.lang.ClassCastException: com.myapp.Test123$XClass2 cannot be cast to com.myapp.Test123$XClass1 
    at com.myapp.Test123.test(Test123.java:56) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

ответ

0

Существует небольшая ошибка в последней строке:

XClass2 lass2 = (XClass2) stream.fromXML(reply); 

Я думаю, что это shoult быть

XClass2 lass2 = (XClass2) stream.fromXML(reply2); // reply2 
+0

Извините за неправильный вопрос. Это опечатка. Я все еще получаю ошибку. Могли бы вы помочь. – Patan

+0

Возможно, проблема в том, что оба класса имеют один и тот же XStreamAlias ​​«reply». Как XStream знает, какой класс использовать? –

+0

Да, правда. Есть ли какое-либо решение этого. – Patan

Смежные вопросы