1

を実装する Struts 2 クラスを使用していますModelDriven。jQuery からデータを渡し、データベースにデータを保存することができます。

データを取得して jQuery に戻そうとすると、jQuery で使用できない理由がわかりません。私は基本的な流れで何かが欠けていると確信しています。

これが私のアクションクラスです:

public HttpHeaders index() {
    model = projectService.getProjectDetails(project.getUserID());
    return new DefaultHttpHeaders("success").setLocationId("");
} 

@Override
public Object getModel() {
    return project;
}

public Project getProject() {
    return project;
}

public void setProject(Project project) {
    this.project = project;
}

これが私のjQueryです:

function getProjectDetails() {
    var userID = localStorage.getItem('userID');
    var request = $.ajax({
        url : '/SUH/project.json',
        data : {
            userID : userID
        },
        dataType : 'json',
        type : 'GET',
        async : true
    });

    request.done(function(data) {
        console.log(JSON.stringify(data));
        $.each(data, function(index, element) {
            console.log('element project--->' + index + ":" + element);
            
        });
    });

    request.fail(function(jqXHR, textStatus) {
        console.log('faik');
    });
}

クラスのモデル オブジェクトにはAction利用可能なすべてのデータがありますが、モデル オブジェクトまたはプロジェクト オブジェクトを返そうとしましたが、どちらも機能しませんでした。

4

1 に答える 1

1

デフォルトでは、Struts2 REST プラグインはjson-libを使用して Bean をシリアル化します。を使用している場合はModelDriven、結果を処理するときにモデルに直接アクセスします。.jsonリクエスト URL で拡張子を使用しているため、コンテンツ タイプ ハンドラは拡張子によって選択されます。である必要がありますJsonLibHandler

このハンドラーは、配列またはリスト、またはそれ以外のJSONArray.fromObject(obj)場合を使用して、シリアル化して応答に書き込むことができるものを取得します。objJSONObject.fromObject(obj)JSONObejct

objによって返される値です。あなたのgetModel()場合は になりますproject

JsonLibHandlerはデフォルトを使用しているため、フィールドでJsonConfigない限り、シリアル化される Bean からプロパティを除外することはできません。public

json-lib の次の機能は、 で強化できますJsonConfig

  • サイクル検出、2 つのデフォルト戦略があり (デフォルトでは例外がスローされます)、独自の戦略を登録できます
  • JSON へのシリアライズ時に一時フィールドをスキップする (デフォルト = スキップしない) JSON へのシリアライズ時に JAP @Transient アノテーション付きメソッドをスキップする (デフォルト = スキップしない)
  • JSON にシリアル化するときに Bean プロパティおよび/またはマップ キーを除外する (デフォルト = ['class','metaClass','declaringClass'])
  • フィルターは、JSON にシリアル化するとき、または Java に戻すときにプロパティを除外/含めるためのより細かい詳細を提供します。

一部のプロパティを除外できるこのコード スニペットを見つけることができます。

プロパティを除外

String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";  
JsonConfig jsonConfig = new JsonConfig();  
jsonConfig.setExcludes( new String[]{ "double", "boolean" } );  
JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON( str, jsonConfig );  
assertEquals( "JSON", jsonObject.getString("string") );        
assertEquals( 1, jsonObject.getInt("integer") );        
assertFalse( jsonObject.has("double") );     
assertFalse( jsonObject.has("boolean") );     

プロパティを除外する (フィルターを使用)

String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";  
JsonConfig jsonConfig = new JsonConfig();  
jsonConfig.setJsonPropertyFilter( new PropertyFilter(){    
   public boolean apply( Object source, String name, Object value ) {    
      if( "double".equals(value) || "boolean".equals(value) ){    
         return true;    
      }    
      return false;    
   }    
});    
JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON( str, jsonConfig );  
assertEquals( "JSON", jsonObject.getString("string") );        
assertEquals( 1, jsonObject.getInt("integer") );        
assertFalse( jsonObject.has("double") );     
assertFalse( jsonObject.has("boolean") );

ただし、独自のものを使用してContentTypeHandlerデフォルトをオーバーライドするオプションがあります。

別の方法は、Jackson ライブラリを使用してリクエストを処理することです。docs ページで説明されているように: Jackson フレームワークを JSON として使用しますContentTypeHandler

デフォルトの JSON コンテンツ ハンドラは、JSON-lib の上に構築されています。JacksonLibHandlerJSON シリアル化に Jackson フレームワークを使用する場合は、json 要求のコンテンツ ハンドラーとしてを構成できます。

pom.xmlまず、jar ファイルをダウンロードして WEB-INF/lib の下に配置するか、 maven をビルド システムとして使用している場合は、次の xml スニペットを依存関係セクションに追加して、jackson 依存関係を Web アプリケーションに追加する必要があります。

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-jaxrs</artifactId>
    <version>1.9.13</version>
</dependency>

これで、Content Handler を Jackson Content Handler で上書きできるようになりましたstruts.xml

<bean type="org.apache.struts2.rest.handler.ContentTypeHandler" name="jackson" class="org.apache.struts2.rest.handler.JacksonLibHandler"/>
<constant name="struts.rest.handlerOverride.json" value="jackson"/>

<!-- Set to false if the json content can be returned for any kind of http method -->
<constant name="struts.rest.content.restrictToGET" value="false"/> 

<!-- Set encoding to UTF-8, default is ISO-8859-1 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>

その後、@JsonIgnore注釈を使用できます。

于 2016-06-26T13:29:59.890 に答える