質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

1回答

1605閲覧

springでRESTを使ってJSON形式のレスポンスが返ってこない

kachikata96

総合スコア28

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2020/06/21 14:09

編集2020/06/21 23:55

現在私はspring解体新書という参考書に沿ってspringの学習を進めています。

11章のRESTサービスの単元で11.3まで進めて、ユーザーデータをJSON形式でGETしてブラウザ上に一覧を表示させるところ躓きました。

参考書通りhttp://localhost:8080/rest/getとブラウザにURLを入力してもなぜかhttp://localhost:8080/loginのURLで表示されてしまい、
JSON形式でレスポンスが返ってきません。

コードに関しては参考書が配布しているソースコードをそのまま使ったのでコードに不備はないと思います。

curlに関してはダウンロードはしましたがダウンロードしただけで特にいじっていません。

やはり、eclipseに何かしらcurlの設定をしなくはいけないのでしょうか。

まだ、springの理解が浅く支離滅裂な質問になってしまい申し訳ありませんが
考えられる原因を教えていただけたら幸いです。

java

1//REST用のサービスクラス 2 3package com.example.demo.login.domain.service; 4 5import java.util.List; 6 7import com.example.demo.login.domain.model.User; 8 9public interface RestService { 10 11 //1件登録用メソッド 12 public boolean insert(User user); 13 14 //1件検索用メソッド 15 public User selectOne(String userId); 16 17 //全件検索用メソッド 18 public List<User> selectMany(); 19 20 //1件更新用メソッド 21 public boolean update(User user); 22 23 //1件削除用メソッド 24 public boolean delete(String userId); 25}

java

1//JDBCを使うクラス 2 3package com.example.demo.login.domain.service.jdbc; 4 5import java.util.List; 6 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.beans.factory.annotation.Qualifier; 9import org.springframework.stereotype.Service; 10import org.springframework.transaction.annotation.Transactional; 11 12import com.example.demo.login.domain.model.User; 13import com.example.demo.login.domain.repository.UserDao; 14import com.example.demo.login.domain.service.RestService; 15 16@Transactional 17@Service 18public class RestServiceJdbcImpl implements RestService { 19 20 @Autowired 21 @Qualifier("UserDaoJdbcImpl") 22 UserDao dao; 23 24 //1件登録用メソッド 25 @Override 26 public boolean insert(User user) { 27 28 int result = dao.insertOne(user); 29 30 if(result == 0) { 31 32 return false; 33 34 } else { 35 36 return true; 37 38 } 39 } 40 41 //1件検索用メソッド 42 @Override 43 public User selectOne(String userId) { 44 return dao.selectOne(userId); 45 } 46 47 //全件検索用メソッド 48 @Override 49 public List<User> selectMany() { 50 return dao.selectMany(); 51 } 52 53 //1件更新用メソッド 54 @Override 55 public boolean update(User user) { 56 57 int result = dao.updateOne(user); 58 59 if(result == 0) { 60 61 return false; 62 63 } else { 64 65 return true; 66 67 } 68 } 69 70 //1件削除用メソッド 71 @Override 72 public boolean delete(String userId) { 73 74 int result = dao.deleteOne(userId); 75 76 if(result == 0) { 77 78 return false; 79 80 } else { 81 82 return true; 83 84 } 85 } 86}

java

1//REST用のコントローラークラス 2 3package com.example.demo.login.controller; 4 5import java.util.List; 6 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.web.bind.annotation.DeleteMapping; 9import org.springframework.web.bind.annotation.GetMapping; 10import org.springframework.web.bind.annotation.PathVariable; 11import org.springframework.web.bind.annotation.PostMapping; 12import org.springframework.web.bind.annotation.PutMapping; 13import org.springframework.web.bind.annotation.RequestBody; 14import org.springframework.web.bind.annotation.RestController; 15 16import com.example.demo.login.domain.model.User; 17import com.example.demo.login.domain.service.RestService; 18 19@RestController 20public class UserRestController { 21 22 @Autowired 23 RestService service; 24 25 /** 26 * ユーザー全件取得 27 */ 28 @GetMapping("/rest/get") 29 public List<User> getUserMany() { 30 31 // ユーザー全件取得 32 return service.selectMany(); 33 } 34 35 /** 36 * ユーザー1件取得 37 */ 38 @GetMapping("/rest/get/{id:.+}") 39 public User getUserOne(@PathVariable("id") String userId) { 40 41 // ユーザー1件取得 42 return service.selectOne(userId); 43 } 44 45 /** 46 * ユーザー1件登録 47 */ 48 @PostMapping("/rest/insert") 49 public String postUserOne(@RequestBody User user) { 50 51 // ユーザーを1件登録 52 boolean result = service.insert(user); 53 54 String str = ""; 55 56 if(result == true) { 57 58 str = "{\"result\":\"ok\"}"; 59 60 } else { 61 62 str = "{\"result\":\"error\"}"; 63 64 } 65 66 // 結果用の文字列をリターン 67 return str; 68 } 69 70 /** 71 * ユーザー1件登録 72 */ 73 @PutMapping("/rest/update") 74 public String putUserOne(@RequestBody User user) { 75 76 // ユーザーを1件登録 77 boolean result = service.update(user); 78 79 String str = ""; 80 81 if(result == true) { 82 83 str = "{\"result\":\"ok\"}"; 84 85 } else { 86 87 str = "{\"result\":\"error\"}"; 88 89 } 90 91 // 結果用の文字列をリターン 92 return str; 93 } 94 95 @DeleteMapping("/rest/delete/{id:.+}") 96 public String deleteUserOne(@PathVariable("id") String userId) { 97 98 // ユーザーを1件削除 99 boolean result = service.delete(userId); 100 101 String str = ""; 102 103 if(result == true) { 104 105 str = "{\"result\":\"ok\"}"; 106 107 } else { 108 109 str = "{\"result\":\"error\"}"; 110 111 } 112 113 // 結果用の文字列をリターン 114 return str; 115 } 116}

java

1//RESTサービスのみCSRF対策を無効にするためにRequestMatcherを実装したクラス 2 3package com.example.demo; 4 5import javax.servlet.http.HttpServletRequest; 6 7import org.springframework.security.web.util.matcher.AntPathRequestMatcher; 8import org.springframework.security.web.util.matcher.RequestMatcher; 9 10public class RestMatcher implements RequestMatcher { 11 12 //マッチャー 13 private AntPathRequestMatcher matcher; 14 15 //コンストラクタ 16 public RestMatcher(String url) { 17 super(); 18 matcher = new AntPathRequestMatcher(url); 19 } 20 21 //URLのマッチ条件 22 @Override 23 public boolean matches(HttpServletRequest request) { 24 25 // GETならCSRFのチェックはしない 26 if("GET".equals(request.getMethod())) 27 return false; 28 29 // 特定のURLに該当する場合、CSRFチェックしない 30 if(matcher.matches(request)) 31 return false; 32 33 return true; 34 } 35}

java

1//上記のRequestMatcherを反映させたSecuriryConfigクラス 2 3package com.example.demo; 4 5import javax.sql.DataSource; 6 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.context.annotation.Bean; 9import org.springframework.context.annotation.Configuration; 10import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 11import org.springframework.security.config.annotation.web.builders.HttpSecurity; 12import org.springframework.security.config.annotation.web.builders.WebSecurity; 13import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 14import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 15import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 16import org.springframework.security.crypto.password.PasswordEncoder; 17import org.springframework.security.web.util.matcher.AntPathRequestMatcher; 18import org.springframework.security.web.util.matcher.RequestMatcher; 19 20@EnableWebSecurity 21@Configuration 22public class SecurityConfig extends WebSecurityConfigurerAdapter { 23 24 // データソース 25 @Autowired 26 private DataSource dataSource; 27 28 @Bean 29 public PasswordEncoder passwordEncoder() { 30 return new BCryptPasswordEncoder(); 31 } 32 33 // ユーザーIDとパスワードを取得するSQL文 34 private static final String USER_SQL = "SELECT" 35 + " user_id," 36 + " password," 37 + " true" 38 + " FROM" 39 + " m_user" 40 + " WHERE" 41 + " user_id = ?"; 42 43 // ユーザーのロールを取得するSQL文 44 private static final String ROLE_SQL = "SELECT" 45 + " user_id," 46 + " role" 47 + " FROM" 48 + " m_user" 49 + " WHERE" 50 + " user_id = ?"; 51 52 @Override 53 public void configure(WebSecurity web) throws Exception { 54 55 //静的リソースへのアクセスには、セキュリティを適用しない 56 web.ignoring().antMatchers("/webjars/∗∗", "/css/∗∗"); 57 } 58 59 @Override 60 protected void configure(HttpSecurity http) throws Exception { 61 62 // ログイン不要ページの設定 63 http 64 .authorizeRequests() 65 .antMatchers("/webjars/**").permitAll() //webjarsへアクセス許可 66 .antMatchers("/css/**").permitAll() //cssへアクセス許可 67 .antMatchers("/login").permitAll() //ログインページは直リンクOK 68 .antMatchers("/signup").permitAll() //ユーザー登録画面は直リンクOK 69 .antMatchers("/rest/**").permitAll() //RESTは直リンクOK 70 .antMatchers("/admin").hasAuthority("ROLE_ADMIN") //アドミンユーザーに許可 71 .anyRequest().authenticated(); //それ以外は直リンク禁止 72 73 //ログイン処理 74 http 75 .formLogin() 76 .loginProcessingUrl("/login") //ログイン処理のパス 77 .loginPage("/login") //ログインページの指定 78 .failureUrl("/login") //ログイン失敗時の遷移先 79 .usernameParameter("userId") //ログインページのユーザーID 80 .passwordParameter("password") //ログインページのパスワード 81 .defaultSuccessUrl("/home", true); //ログイン成功後の遷移先 82 83 //ログアウト処理 84 http 85 .logout() 86 .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) // 87 .logoutUrl("/logout") //ログアウトのURL 88 .logoutSuccessUrl("/login"); //ログアウト成功後のURL 89 90 //CSRFを無効にするURLを設定 91 RequestMatcher csrfMatcher = new RestMatcher("/rest/**"); 92 93 //RESTのみCSRF対策を無効に設定 94 http.csrf().requireCsrfProtectionMatcher(csrfMatcher); 95 } 96 97 @Override 98 protected void configure(AuthenticationManagerBuilder auth) throws Exception { 99 100 // ログイン処理時のユーザー情報を、DBから取得する 101 auth.jdbcAuthentication() 102 .dataSource(dataSource) 103 .usersByUsernameQuery(USER_SQL) 104 .authoritiesByUsernameQuery(ROLE_SQL) 105 .passwordEncoder(passwordEncoder()); 106 } 107} 108

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/06/21 20:28

そのコードをご提示ください 全ての人が同じ書籍を使うわけではなく、書籍をもっていたとしてこの内容では本当に書籍通りか確かめることはできません。 というか、書籍通りか否かより「Springの作法に則って書かれているかどうか」のほうが大事なので、やはり再現するコードは必要です。 質問編集して追記願います
kachikata96

2020/06/21 23:43

至らない質問で申し訳ありせん。 コード追記します。
退会済みユーザー

退会済みユーザー

2020/06/22 00:28

依存関係は? あとコマンド結果のテキストも
kachikata96

2020/06/22 00:57

依存関係を示すには何を記述すればいいでしょうか?
guest

回答1

0

ベストアンサー

SpringBoot 2.3.1 + SpringSecurityの環境にて記述していただいたコードのみで実行したところ、/rest/get は SpringSecurityの設定どおり許可され、

java

1.antMatchers("/rest/**").permitAll() //RESTは直リンクOK 2

の記述をコメントアウトして再起動したところ、/login へリダイレクトされていますので、記述された内容のみで判断したところ、特に問題はありませんでした。

他の要因ですが、
Datasourceの設定(主に接続部分)などに誤りはないか、ログイン時に問い合わせているSQLにて参照しているテーブルが存在するか、ビルドエラーは発生していないか、などを確認しましょう。

投稿2020/06/28 05:45

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問