2016-10-07 3 views
1

AngularJS、JAX-RS、およびHibernateを使用して小さなWebアプリケーションを作成しました。私は私のタイプ 'Plugin'のオブジェクトを取得して保存しようとしています。取得はうまくいくが保存はしない。私はサーバー上のオブジェクトを見ると、初期化されますが、オブジェクト全体のjson文字列に設定されたString型のtitleプロパティには、すべてのプロパティがnullになります。

{"id":"22a7533fb6-...", "title":"My Plugin"} 

AngularJS:

function save(plugin) { 
    return $resource('rest/plugins/save', { plugin: plugin }, { 
     save : { 
      method : 'PUT', 
      isArray : false 
     } 
    }); 
} 

JAX-RS

@PUT 
@Path("save") 
@Consumes(MediaType.APPLICATION_JSON) 
public void savePlugin(@Context HttpServletRequest req, @QueryParam("plugin") Plugin plugin) throws IOException { 
    log.debug("plugin..." + plugin.getTitle()); 
} 

プラグイン

@Entity 
@Table(name = "plugin") 
public class Plugin { 

    @Id 
    @Column(name = "id", unique = true, length = 36, nullable = false) 
    private String id; 

    @Column(name = "title", unique = true, length = 255, nullable = false) 
    private String title; 

    // getters and setters without any annotations... 
} 

JavaScriptでのプラグインの変数を見ると、それは完全なオブジェクトです。そして、要求は任意のヘルプ

Request URL:/rest/plugins/save?plugin=%7B%22id%22:%22a7533fb6-d36f-459b-b9e7-bb64cdaae1e3%22,%22title%22:%22My+Plugin%22%7D 

おかげで、コピリクエストのパラメータとしてペイロードとしてではなく、データを送信するためにティップのためのカッシオのソリューション おかげカシオ後

UPDATEです。私はあなたが言ったようにJAX-RSの部分を変更します。さらに、コントローラと私のサービスを角度で変更しなければなりませんでした。

サービス:

services.factory('PluginService', [ '$resource', function($resource) { 
    return $resource('rest/plugins/:id', null, { 
     'update' : { method : 'PUT' } 
    }); 
} ]); 

コントローラー:

controllers.controller('PluginController', [ 
    '$scope', 
    'PluginService', 
    function($scope, PluginService) { 
     $scope.save = function(plugin) { 
      PluginService.update({id:plugin.id}, plugin, function(data) { 
       console.log("Plugin saved."); 
      }, function(err) { 
       console.log("Error while saving Plugin."); 
      }); 
    } 
}]); 

答えて

1

クエリパラメータとしてPluginを送信しないでください。要求ペイロードでそれを送信します。

PUT /rest/plugins/save HTTP/1.1 
Host: example.org 
Content-Type: application/json 

{ 
    "id": "22a7533fb6-d36f-459b-b9e7-bb64cdaae1e3", 
    "title": "My Plugin" 
} 

あなたのリソースメソッドは次のようにする必要があります:

@PUT 
@Path("save") 
@Consumes(MediaType.APPLICATION_JSON) 
public void savePlugin(@Context HttpServletRequest request, 
         Plugin plugin) throws IOException { 
    ... 
} 
+1

ありがとう、私はいくつかの間違いがあった。 JAX-RSでAngularのペイロードとして送信し、あなたが言ったようにJAX-RSで受信するので、動作します。私はAngular ControllerとServiceにいくつかの変更を加えなければなりませんでした。 –

+0

@kopi_b私の答えをUpvoting私の劣等感を軽減するのに役立ちます:) –

+1

あなたは行く:) –

0

あなたはhttpリクエストに以下のようなコンテンツタイプとヘッダを追加し、要求を再試行できます。

var request = $http({ 
      method: 'POST', 
      url: url, 
      headers: { 
       'Content-Type': 'application/json' 
      }, 
      data: plugin 
     }); 

もう一つの提案は、既存のプラグインクラスからすべての注釈を除去することにより、新しいJavaクラスを作成して保存する方法でそれを指定することができます。

public class Plugin 
{ 
    public String id; 
    public String title; 
    } 
+0

残念ながら私の$リソース要求にコンテンツタイプを追加しても、違いはありません。 –

+0

もう1つの提案は、既存のPluginクラスからすべての注釈を削除し、saveメソッドで指定することで、新しいJavaクラスを作成できますか? – rinoy

関連する問題