2016-07-20 16 views
2

Ich muss JSON Plugin (https://struts.apache.org/docs/json-plugin.html) mit meiner aktuellen JAVA-Webanwendung konfigurieren. Was ich getan habe:Inkompatible Typen für die Eigenschaft setData [JSON + Struts2 plugin]

1) Hinzugefügt zu pom.xml Datei alle Abhängigkeiten für das Plugin.

<dependency> 
    <groupId>org.apache.struts</groupId> 
    <artifactId>struts2-json-plugin</artifactId> 
    <version>2.3.24.1</version> 
</dependency> 

2) mit dem Paket in struts.xml Erweiterte json-default

<package name="my-test-package" extends="xxx, json-default" 
    namespace="/my-test-package"> 

3) Hinzu kommt meine Aktion die Abfangjäger und Ergebnistyp von json

<action name="myMainAction" 
    class="org.com.action.myMainAction"> 
     <interceptor-ref name="json"> 
      <param name="enableSMD">true</param> 
     </interceptor-ref> 
     <result type="json">      
     </result>   
    <param name="requiredAuthorities">F_ADD</param> 
</action> 

4) Erstellt ein Modell Klasse Marriage mit nur Setter/Getters drin.

5) Geschaffen, um die Action-Klasse, mit dem Namen als myMainAction mit folgendem Code

private List <Marriage> data; 

public List<Marriage> getData() { 
    return data; 
} 
public void setData(List<Marriage> data) { 
    System.out.println("Inside the setter "); 
    this.data = data; 
} 


@Override 
public String execute() throws Exception { 

    System.out.println(data.get(0).getLastNameHe()); 

    return SUCCESS; 
} 

6) Erstellt ein JSON Objekt und übergab es über ajax an den Server. Ich kann über die Google Chrome-Konsole sehen, dass die Daten gesendet werden und das JSON-Objekt analysiert wird und alle Daten darin enthalten sind. Es wird jedoch eine Ausnahme in meinem Eclipse und auch in Chrome-Konsole werfen:

Exception occurred during processing request: Incompatible types for property setData (CommonsLogger.java [qtp1144623021-22]) org.apache.struts2.json.JSONException: Incompatible types for property setData

Könnten Sie mir bitte zu einem gewissen richtige Richtung, es ist fast der zweite Tag, die ich bin auf sie arbeiten, aber es funktioniert nicht scheinen zu arbeiten.

EDIT1: Die Daten, die an Java-Seite gesendet werden, und ich kann es über die Chrome-Konsole sehen.

{"data":{"recordId":"123","registrationDate":"20-07-2016","hisId":"","herId":"","lastNameHe":"Asd","firstNameHe":"Asd","middleNameHe":"Asd","workPlaceHe":"","educationHe"}} 

Dies ist das Objekt, nachdem es JSON.stringify -ed war. Wie Sie sehen können, hat es die Wurzel data Variable und dann geht der ganze Rest der Daten darunter. Laut meiner Logik muss Ti die setter der Daten in meiner Java-Klasse finden und dann die Setter/Getter dieser Klasse aufrufen. P.S Ich habe den Namen der Klassen und etc umbenannt, also keine Sorgen über Namenskonventionen) Ich habe die richtigen Dinge auf meinem Produktionscode.

EDIT2:

Dank für das zu meinen Fehler @AleksandrM Hinweis. Nun wirft es eine sehr seltsame Fehler:

Unparseable date: "20-07-2016" (CommonsLogger.java [qtp212900572-17]) java.text.ParseException: Unparseable date: "20-07-2016"

Die json Variable für diesen Teil ist registrationDate und seine Implementierung in JAVA:

private Date registrationDate; 
    public Date getRegistrationDate() { 
    return registrationDate; 
} 

public void setRegistrationDate(Date registrationDate) { 
    this.registrationDate = registrationDate; 

Wie ich verstehe es versucht, eine string-date zu setzen und es kann tu es nicht. Warum kann das json-plugin es nicht konvertieren? Soll ich etwas in die Optionen/Einstellungen schreiben?

+0

Funktioniert es, wenn Sie defaultStack plus json interceptor statt nur json interceptor verwenden? Hat Heirat einen Standard-No-Args-Konstruktor (oder keine Konstruktoren)? P.S: Eine Java-Klasse, die mit einem Großbuchstaben beginnt, ist NICHT gut. –

+0

Sie müssen 'defaultStack' +' json'-Interceptor verwenden. Zeigen Sie die Daten an, die Sie übermitteln. –

+0

@AndreaLigios, ich denke nicht, dass es das Problem des defaultStack oder die Position der Abfangjäger in den Streben ist. Und meine Marraige-Klasse hat keine Konstrukteure. Diese Marraige-Klasse ist mit Hibernate verbunden, um db-Tabellen und dergleichen zu erstellen, und der Zweck dieser Klasse ist nur ein reines Modell, das sie beschreibt. – Daler

Antwort

2

Sie erwarten List<Marriage> data im Java-Code, aber Ihr JSON-Objekt enthält kein Array. Ändern Sie entweder den Java-Code in Marriage data oder geben Sie ein Array von Objekten in JSON ein.

Sie können auch andere Interzeptoren neben json für die Aktion definieren. Erstellen Sie einen benutzerdefinierten Interceptor-Stack und referenzieren Sie ihn in Ihrer Aktionskonfiguration.

<interceptor-stack name="json-stack"> 
    <interceptor-ref name="json" /> 
    <interceptor-ref name="defaultStack" /> 
</interceptor-stack> 

Für die Datums-String Date Objekt Konvertierung Verwendung Standardformat (das yyyy-MM-dd'T'HH:mm:ss ist) oder eine benutzerdefinierte erstellen Struts type converter. oder verwenden Sie @JSON(format = "dd.MM.yyyy") auf dem Setter.

Siehe this follow up question.

+0

Der Vollständigkeit halber ist das Standardformat (nur Datum RFC3339) [verfügbar ab 2.3.28] (https://issues.apache.org/jira/browse/WW-4551), während er 2.3.24.1 verwendet und daher gezwungen ist für einen Konverter zu gehen –

+0

@AndreaLigios \t Es scheint, als ob der Teil über JSON und Typumwandlung falsch ist. Ich werde es ändern. –

+0

@AndreaLigios, habe ich über das Standardformat Datum gelesen, und ich kenne den Patch, aber ich kann nicht upgraden, weil ich ein großes Framework verwende und ich ein separates Modul dafür entwickeln .. Ich will nicht sich mit einem anderen Rahmenproblem befassen, so – Daler