2017-07-10 11 views
0

登録フォームからすべてのフィールドを送信してPostgreSQLデータベースに保存したいとします。私はSpring MVCとjQueryを使用しています。 POSTリクエストは、Postmanを使用してのみ動作しています。フォームを提出するために登録ボタンをクリックすると、それは私に与えます -Jqueryを使用してPOST要求をRESTエンドポイントに送信

"Request method 'POST' not supported".

誰か私を助けることができますか?

ユーザーコントローラー:

@RestController 
public class UserController { 

@Autowired 
private UserService userService; 

@RequestMapping(method=RequestMethod.POST, value="/save", headers="Accept=application/x-www-form-urlencoded") 
public void registerUser(@RequestBody User user) { 
    userService.registerUser(user); 
} 
} 

PageControllerで:

@Controller 
public class PageController { 

@RequestMapping("/login") 
public String login() { 
    return "index.html"; 
} 

} 

モデル:

@Entity 
@Data 
@Table(name="users") 
public class User { 

@Id @GeneratedValue 
private long id; 

@Column(name="sex") 
private String sex; 

@Column(name="skype") 
private String skype; 

@Column(name="username") 
private String userName; 

@Column(name="email") 
private String email; 

@Column(name="password") 
private String password; 

protected User(){}; 
} 

HTML:

<!doctype html> 
<html> 
<head> 
<title>Login/Register</title> 
<link 
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" 
rel="stylesheet" type="text/css"> 
<link href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font- 
awesome.min.css" rel="stylesheet" type="text/css"> 
<link rel="stylesheet" type="text/css" href="css/style.css"> 
<script src="js/login.js"></script> 
</head> 
<body> 
<br> 
<div class="row"> 
    <div class="container"> 
     <div class="login-register-form-section"> 
      <ul class="nav nav-tabs" role="tablist"> 
       <li class="active"><a href="#login" data- 
toggle="tab">Login</a></li> 
       <li><a href="#register" data-toggle="tab">Register</a></li> 
      </ul> 
      <div class="tab-content"> 
       <div role="tabpanel" class="tab-pane fade in active" 
id="login"> 
        <form class="form-horizontal" method="post" action=""> 
         <div class="form-group " > 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-user"></i></div> 
           <input type="text" name="login_email" class="form-control" placeholder="Username or email" required="required" value=""> 
          </div> 
         </div> 
         <div class="form-group "> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-key"></i></div> 
           <input type="password" name="login_password" class="form-control" placeholder="Password" required="required"> 
          </div> 
         </div> 
         <div class="form-group"> 
          <input type="checkbox" id="rememberMe"> 
          <label for="rememberMe">Remember Me</label> 
          <a href="#" class="pull-right">Forgot password?</a> 
         </div> 
         <input type="submit" value="Login" class="btn btn-success btn-custom"> 
        </form> 
       </div> 
       <div role="tabpanel" class="tab-pane fade" id="register"> 
        <form class="form-horizontal" method="post" action=""> 
         <div class="form-group" id="sex"> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-user"></i></div> 
           <select type="text" name="gender" class="form-control"> 
           <option>Male</option> 
           <option>Female</option> 
           </select> 
          </div> 
         </div> 
         <div class="form-group "> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-male"></i></div> 
           <input type="text" name="register_username" class="form-control" placeholder="Username" required="required" value=""> 
          </div> 
         </div> 
         <div class="form-group "> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-envelope"></i></div> 
           <input type="email" name="register_email" class="form-control" placeholder="Email" required="required" value=""> 
          </div> 
         </div> 
         <div class="form-group "> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-skype"></i></div> 
           <input type="text" name="register_skype" class="form-control" placeholder="Skype name" required="required" value=""> 
          </div> 
         </div> 
         <div class="form-group "> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-lock"></i></div> 
           <input type="password" name="register_password" class="form-control" placeholder="Password" required="required"> 
          </div> 
         </div> 
         <input type="submit" id="submitbtn" value="Register" class="btn btn-success btn-custom"> 
        </form> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 

のjQuery:

jQuery(document).ready(
function($) { 

    $("#submitbtn").click(function(event) { 

     var data = {} 
     data["sex"] = $("#sex").val(); 
     data["skype"] = $("#register_username").val(); 
     data["username"] = $("#register_email").val(); 
     data["email"] = $("#register_skype").val(); 
     data["password"] = $("#register_password").val(); 

     $("#submitbtn").prop("disabled", true); 

     $.ajax({ 
       type: "POST", 
       contentType: "application/json", 
       url: "/save", 
       data: JSON.stringify(data), 
       dataType: 'json', 
       timeout: 600000, 
       success: function (data) { 
        console.log("DONE"); 
       }, 
       error: function (e) { 
        console.log("ERROR: ", e); 
        display(e); 
       } 
     }); 


    }); 

}); 
+0

コントローラのコンテンツタイプをcontentType: "application/json" – cralfaro

+0

に変更しますか?ヘッダー= "Accept = application/json" – Michael

答えて

0

[OK]を、問題は私が名前= "電子メール"を使用していたid = "電子メール"の代わりにdom要素を正しく選択していないということです。

<input type="text" name="register_skype" ...... > 
0

代わりの入力タイプ= '提出' を行うには、あなたが入力タイプ= 'ボタン' を使用して試すことができます

回線を変更するdata["username"] = $("#register_email").val(); to data["userName"] = $("#register_email").val();

+0

does not work .... – Michael

+0

あなたのJSONフィールド名が一致していないと思います。あなたのクラスにはuserNameがあり、jqueryにはそれをユーザー名として持っています。 – sparrow

+0

機能しません。関数が失敗した場合、 "error:"ブロックを実行する必要があるので、jQueryでファイルが表示されないようです。 – Michael

0

あなたのajaxコールでapplication/jsonを送信していますが、コントローラではエンドポイントにapplication/x-www-form-urlencodedしか受け付けていないと言います。あなたはapplication/jsonを受け入れるようにコントローラを変更することができます

@RequestMapping(method=RequestMethod.POST, value="/save", headers="Accept=application/json") 

タイプミスを避けるために、あなたはまた、@RequestMapping年代consumes属性を使用し、そしてそれをMediaType定数渡すことができます。

@RequestMapping(method=RequestMethod.POST, value="/save", consumes=MediaType.APPLICATION_JSON_VALUE) 

しますか、シリアル化されたフォームデータを送信するためにajax呼び出しをリファクタリングすることができます。

@sparrowと同様に、デフォルトのブラウザ送信動作を回避するために、ボタンのtype属性をbuttonに変更することもできます。また、クリックハンドラ関数内でevent.preventDefault();を呼び出して同じことを達成することもできますが、実際にはブラウザのデフォルトの送信動作を使用しない限り、type="submit"を使用するのはあまり意味がありません。

+0

それをしました。私は何も起こりません、エラーはない、コンソールでメッセージをクリックして今すぐ。 – Michael

+0

jQueryでファイルが表示されないようです。どうしてか分かりません。 – Michael

+0

私はPOSTリクエストをURLにしようとすると問題はありません:/ Postmanを使用して保存すると、データがDBに正常に保存されます。 – Michael

関連する問題