2016-10-13 14 views
0

私のアプリでは、いくつかの投稿機能を実装しようとしています。AngularJS 400不正リクエスト

私は以下の記事の方法を持っている:

restrictLoginAttemptsFromSingleIp: function (id, userId) { 
    var serviceUri = baseServicesUrlService.getBaseServicesUrl() + "/employee-service/restrict-single-ip"; 
    return $http.post(serviceUri, {restrictLoginAttemptIp: {loginAttemptIds: [id]}, dataOwnerId: userId}); 
} 

私のサーバ側は、Hibernateの検証とRESTEasyの3.0.4を使用している:

@POST 
@Path("/restrict-single-ip") 
public Response RestrictSingleIp(@Valid RestrictLoginAttemptIpRequest requestData, @Context HttpRequest request){ 
     return Response.status(200).build(); 
} 

RestrictLoginAttemptIpRequestクラスは、タイプの1つのフィールド(dataOwnerId)を継承しますLongからPostBase

public class RestrictLoginAttemptIpRequest extends PostBase { 
    private RestrictLoginAttemptIp restrictLoginAttemptIp; 

    public RestrictLoginAttemptIp getRestrictLoginAttemptIp() { 
     return restrictLoginAttemptIp; 
    } 

    public void setRestrictLoginAttemptIp(RestrictLoginAttemptIp restrictLoginAttemptIp) { 
     this.restrictLoginAttemptIp = restrictLoginAttemptIp; 
    } 
} 

RestrictLoginAttemptIpクラス:

package blah; 

import org.hibernate.validator.constraints.NotEmpty; 

import java.util.List; 

public class RestrictLoginAttemptIp { 
    @NotEmpty(message = "blah") 
    private List<Long> loginAttemptIds; 

    public List<Long> getLoginAttemptIds() { 
     return loginAttemptIds; 
    } 

    public void setLoginAttemptIds(List<Long> loginAttemptIds) { 
     this.loginAttemptIds = loginAttemptIds; 
    } 
} 

私はOKのようですPOSTリクエストから次のデータ列を取得する:私はとき400不正な要求エラーを取得する理由

{restrictLoginAttemptIp={loginAttemptIds=[328]}, dataOwnerId=8} 

誰かが私に説明していただけます私はその機能を呼び出す?

これはLongデータ型のためですか?私は何とかJavascriptでマークをLongsにする必要がありますか?

答えて

0

4時間後、私は問題を理解しました。

私はセキュリティインターセプタでPOSTデータ(権限の問題の解決)を読んでいます。 RESTEasyでのPOSTデータの読み込みはちょっと難しいです。それは私が私のAngularJSインターセプタで検索次のコードスニペット

String result = IOUtils.toString(requestContext.getEntityStream()); 
ObjectMapper mapper = new ObjectMapper(); 
Object obj = mapper.readValue(result, Object.class); 

に考え出しているように私は、Apache IOUtils(https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/IOUtils.html)を使用LinkedHashMapを作成するには(すべてのリクエストのヘッダーに何かを置くための一例に使用)とサーバーが入力ストリーム:java.io.ioexception no content to map to object due to end of inputを読み取れないことがわかりました。

最後に、ContainerRequestContextEntityStreamを読んだ後、それは空になりました。解決策は、POSTデータを読み取った後に再投入することでした。このような何か:

private LinkedHashMap getPostData(ContainerRequestContext requestContext) { 
    Object obj = null; 

    try { 
     String result = IOUtils.toString(requestContext.getEntityStream()); 
     ObjectMapper mapper = new ObjectMapper(); 
     obj = mapper.readValue(result, Object.class); 

     //IMPORTANT: After you can get the entity stream only once. After reading the entity stream is empty 
     //so the JSON parser cannot convert EMPTY entity stream into any object. To avoid strange errors (like 400 Bad Request) 
     //you have to convert the string back to input stream and rewrite the empty entity stream. 
     InputStream stream = IOUtils.toInputStream(result); 
     requestContext.setEntityStream(stream); 

     System.out.println(obj); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return (LinkedHashMap) obj; 
} 

P. S. ObjectMapperジャクソン

から来ています
関連する問題