SpringBoot備忘録
はじめに
現在、フリーランスエンジニアとして働いていて、新しい現場では 使わないので備忘録として残しておきたいと考え、今回記事を書いています。
画面遷移
@GetMapping
@GetMapping("/index")
public String index(){
return /index;
}
用途はブラウザからのアクセスがGETリクエストと呼ばれるもので
ページ内に何も入力しない時の新しいページの読み込みやリンクによる画面遷移に
使用します。理由としてはURLに画面入力値が表示されるため、セキュリティ的に好ましくありません。
また、ログアウト処理にも@GetMappingは使用せず、後述する@PostMappingを使用します。
@PostMapping
@PoatMapping("/index")
public String index(){
return /index;
}
こちらはPOSTリクエストと呼ばれるもので画面入力値がURLに表示されません。 このため、フォームに入力した内容をサーバーに送信する際に使用します。
@PutMapping
@PutMapping("/insert")
public String insert(){
return /insert;
}
データ登録の際に使用します。
@DeleteMapping
@DeleteMapping("/delete")
public String delete(){
return /delete;
}
データ削除の際に使用します。
@RequestMapping
@RequestMapping(value="/index", method=RequestMethod.POST)
public String index(){
return /index;
}
- value 遷移先のURLを指定します。
- method リクエストの形式を指定します。
@Pathvariable
@GetMapping("/index")
public String index(@Pathvariable int id){
return "/index";
}画面遷移時にリクエストパラメーターに含まれるidの数値によって処理を分けたい場合に使用します。
Dependency Injection
DIの基礎
@Autowired private SampleClass sampleClass;
簡潔に何をしているかですが、SampleClassというクラスのインスタンスを生成して sampleClassというフィールドの代入しています。これにより下記のようにnewキーワードを用いてインスタンスを生成 するよりもコードがすっきりします。
SampleClass sampleClass = new SampleClass();DIの応用
@Configuration
public class ApplicationConfig {
public JavaMailSender mailSender;
@Bean
@Primary
public ApplicationService beanConfig() {
return new ApplicationServiceImpl();
}
@Bean
@Primary
public CustomerServiceImpl customerServiceConfig() {
return new CustomerServiceImpl(mailSender);
}
@Bean
public JavaMailSender javaMailSenderSetup() {
return new JavaMailSenderImpl();
}
上記は私が開発したアプリのApplicationConfig.javaというクラスです。 @Autoworedを使用した時に、実行時エラーが発生することがありますので、上記のようなBeanを 定義すると解消できます。あと、後述する@Componentや、@Service @Controller @Repositoryを付けるのも基本です。 複数のアノテーションを使用していますので一つずつ説明します。
| @Configuration | Springの設定クラスを表すアノテーションです。主にBeanの設定情報を記載します。 |
|---|---|
| @Bean | Beanを定義します。 |
| @Primary | 複数のBeanが同じ型を実装している場合に、どのBeanを優先的に使用するか指定するためのアノテーション |
コントローラー
@Controller
@Controller
class SampleController{}
ブラウザからのリクエストをサーバーが受け取り、@Controllerを付与しているクラスに制御が移り 開きたいパスが書いているハンドラメソッドを動かしてHTMLをレスポンスとして返します。
@RestController
@RestController
class SampleRestController{}
基本的には@Controllerと同じですが、RestAPI開発時しか使用しないアノテーションです。
Lombok
@Data
@Data
class LombokSample{
int age;
String name;
}@Dataはゲッターとセッターを自動生成してくれます。これによりコードがすっきりしますし、コーディングの作業時間を短縮できます。 ※ソースコード上にはゲッターとセッターは表示されません。
@NoArgsConstructor
@Data
@NoArgsConstructor
class LombokSample{
int age;
String name;
}@NoArgsConstructorを定義しておけば、自動で引数無しのコンストラクターを作成してくれます。
※こちらも@Dataと同様ソースコード上にはゲッターとセッターは表示されません。@AllArgsConstructor
@Data
@NoArgsConstructor
@AllArgsConstructor
class LombokSample{
int age;
String name;
}@NoArgsConstructorと似ていますが、こちらは全てのフィールドを引数を持つコンストラクターを自動生成
してくれます。
※こちらも@Dataと同様ソースコード上にはゲッターとセッターは表示されません。
RequiredConstructor
@RequiredConstructor @Dataclass Sample{
private final String args;
}finalを付与したフィールドと@NonNullのフィールドを対象にしたコンストラクタを生成します。
画面側との値の受け渡し
Model
@GetMapping("/index")
public String index(Model model){
Account account = new Account();
model.addAttribute("account", account);
return "/index";
}
@GetMapping("/index")
public String index(Model model){
Account account = new Account();
model.addAttribute("account", account);
return "/index";
}Modelはバックエンドとフロントエンドの橋渡しをしてくれるインターフェースです。 上記の例ではAccount型のaccountをmodel.addAttributeをしていますが、これは画面側にaccount を渡す役割を持っています。HTMLで受け取ったデータをどのように表示するのかは下記の通りです。 ※下記はThymeleafを使用しています。
①
xmlns:th="http://www.thymeleaf.org"②
th:object="${Account}③
span th:text="*{userId}">ユーザーID>HTMLタグ内に①を記載し、divタグなどに②を記載して③のようにth:textを使用することによって画面に表示できます。
@ModelAttribute
@RequestMapping(value="index", method=RequestMethod.POST)
public String index(@ModelAttribute Account account, Model model){
String password = account.getPassword();
model.addAttribute("password", password);
return "/index";
}リクエストパラメーターをオブジェクト化して画面側に渡すことが出来ます。
@RequestParam
@GetMapping("/index")
public String index(@RequestParam("int id"), Model model){
model.addAttribute("id", id);
return "/index";
}
@GetMapping("/index")
public String index(@RequestParam("int id"), Model model){
model.addAttribute("id", id);
return "/index";
}リクエスト(クエリ)パラメーターや、リクエストボディを受け取ることが出来ます。 このアノテーションは属性を設定できます。
| name またはvalue | リクエストパラメーターを受け取る変数を指定 |
|---|---|
| required | パラメーターはデフォルトでは必須のため、パラメーター指定を任意にする場合、falseを指定 |
| defaultValue | リクエストで値を受け取るか、判らない場合に付与 |
Spring Bootエラー内容
TemplateInputException
thymeleafを使用していると起きるエラーで、不明なことが多く対処に時間が掛かることがあります。
- 変数名の間違い
- thymeleafの文法エラーが起因している。*{}を ${}にしているなど。
- ThymeleafのエラーはHTMLファイルや、Javaソースコードに問題ないのに起きることがある。解決法は時間を置けば治るのか?
- ディレクトリ構成が原因の場合もある。HTMLファイルを違うフォルダに格納しているなど。
- コントローラクラスのハンドラメソッドにreturn文にHTMLファイルの親フォルダを記述していないと発生
- コントローラクラスのハンドラメソッドにModelのmodel.addAttributeがない場合に発生
- コントローラークラスのHTMLファイル名に誤字があった
さいごに
ここまで沢山述べましたが、まだまだSpringのセッション管理やバリデーションなど知らないことが多いので 今後も継続して学習に努めたいと思います。