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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

解決済

Spring Boot でibatisを使用したinsertが上手くいかない DB=PostgreSQL

nissyan_hk
nissyan_hk

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

2回答

0評価

0クリップ

291閲覧

投稿2022/08/13 16:32

編集2022/08/14 21:36

前提

Spring Boot version '2.5.6'
認証機能は、Spring Securityを使用
DB : PostgreSQL13
GIt Hub該当のソース:https://github.com/NishiguchiHiroki/TodoApp

質問の内容:
PostgreSQLでenum型のauthorityというカラムを作りました。
createForm.htmlで入力した値(権限)をibatisを使用し、authorityに入れるときエラーが発生します。
言っていることはわかるのですが、コードの書き方がわからないのと、どこを修正すべきかわかりません。

発生している問題・エラーメッセージ

エラー文:column "authority" is of type authority but expression is type character Various ヒント: 式を書き直すか、キャストする必要があります

org.postgresql.util.PSQLException: ERROR: column "authority" is of type authority but expression is of type character varying ヒント: You will need to rewrite or cast the expression. 位置: 65 at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2565) ~[postgresql-42.2.24.jar:42.2.24] at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2297) ~[postgresql-42.2.24.jar:42.2.24] at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:322) ~[postgresql-42.2.24.jar:42.2.24] at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:481) ~[postgresql-42.2.24.jar:42.2.24] at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:401) ~[postgresql-42.2.24.jar:42.2.24] at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164) ~org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433) ~[mybatis-spring-2.0.1.jar:2.0.1] at com.sun.proxy.$Proxy68.insert(Unknown Source) ~[na:na] at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:278) ~[mybatis-spring-2.0.1.jar:2.0.1] at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62) ~[mybatis-3.5.1.jar:3.5.1] at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58) ~[mybatis-3.5.1.jar:3.5.1] at com.sun.proxy.$Proxy101.insert(Unknown Source) ~[na:na] at com.example.its.domain.auth.UserService.create(UserService.java:29) ~[main/:na] at com.example.its.web.user.UserController.create(UserController.java:42) ~[main/:na]

該当のソースコード

createForm.html

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" th:replace="~{fragments/layout :: layout(~{::title}, ~{::body})}"> <head> <title>ユーザー作成 | 課題管理アプリケーション</title> </head> <body> <h1 class="mt-3">ユーザー作成</h1> <a href="../index.html" th:href="@{/}">トップページ</a> <form action="#" th:action="@{/users}" method="post" th:object="${userForm}"> <!-- ユーザー名 --> <div class="mt-3"> <label for="usernameInput" class="form-label">ユーザー名</label> <input type="text" id="usernameInput" class="form-control" th:field="*{username}" th:classappend="${#fields.hasErrors('username')} ? is-invalid"> <p class="invalid-feedback" th:if="${#fields.hasErrors('username')}" th:errors="*{username}">(error)</p> </div> <!-- パスワード --> <div class="mt-3"> <label for="passwordInput" class="form-label">パスワード</label> <input type="password" id="passwordInput" class="form-control" th:field="*{password}" th:classappend="${#fields.hasErrors('password')} ? is-invalid"> <p class="invalid-feedback" th:if="${#fields.hasErrors('password')}" th:errors="*{password}">(error)</p> </div> <div class="mt-3"> <lable class="form-label" for="AuthorityRadio">権限</lable> <div id="AuthorityRadio"> <div class="form-check" th:classappend="${#fields.hasErrors('authority')} ? is-invalid"> <input class="form-check-input" type="radio" id="authorityAdminRadio" th:field="*{authority}" value="ADMIN" th:classappend="${#fields.hasErrors('authority')} ? is-invalid"> <label class="form-check-label" for="authorityAdminRadio">ADMIN</label> </div> <div class="form-check" th:classappend="${#fields.hasErrors('authority')} ? is-invalid"> <input class="form-check-input" type="radio" id="authorityUserRadio" th:field="*{authority}" value="USER" th:classappend="${#fields.hasErrors('authority')} ? is-invalid"> <label class="form-check-label" for="authorityUserRadio">USER</label> </div> <p class="invalid-feedback" th:if="${#fields.hasErrors('authority')}" th:errors="*{authority}">(errors)</p> </div> </div> <!-- ボタン --> <div class="mt-3"> <button type="submit" class="btn btn-primary">作成</button> <a href="./list.html" th:href="@{/users}" class="btn btn-secondary">キャンセル</a> </div> </form> </body> </html>

UserForm.java

package com.example.its.web.user; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import com.example.its.web.Validation.UniqueUsername; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class UserForm { @NotBlank @UniqueUsername private String username; @NotBlank @Size(min=12, max = 128) private String password; private String authority; }

UserController.java

package com.example.its.web.user; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import com.example.its.domain.auth.UserService; import lombok.RequiredArgsConstructor; @Controller @RequestMapping("/users") @RequiredArgsConstructor public class UserController { private final UserService userService; @GetMapping public String showList(Model model) { var x = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); model.addAttribute("userList", userService.findAll()); return "users/list"; } //Get /user/creationForm @GetMapping("/creationForm") public String showCreationForm(@ModelAttribute UserForm form) { return "users/creationForm"; } @PostMapping public String create(@Validated UserForm form, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return showCreationForm(form); } userService.create(form.getUsername(), form.getPassword(), form.getAuthority() ); return "redirect:/users"; } }

UserRepository.java

package com.example.its.domain.auth; import java.util.List; import java.util.Optional; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import com.example.its.domain.auth.User.Authority; @Mapper public interface UserRepository { @Select("select username, email, password, enabled, authority from users where email = #{email}") Optional<User> findByUsername(String email); @Select("select username, email, password, enabled, authority from users") List<User> findAll(); @Insert("insert into users(username, password, authority) values(#{username}, #{password}, #{authority})") void insert(@Param("username") String username, @Param("password") String password, @Param("authority") String authority); }

UserService.java

package com.example.its.domain.auth; import java.util.List; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import com.example.its.domain.auth.User.Authority; import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; @PreAuthorize("hasAuthority('ADMIN')") public List<User> findAll() { return userRepository.findAll(); } @PreAuthorize("hasAuthority('ADMIN')") public void create(String username, String password, String authority) { var encodePassword = passwordEncoder.encode(password); userRepository.insert(username, encodePassword, authority); } }

試したこと

①UserService.javaで引数で受け取ったauthorityをキャストしました。
以下を試しましたが、エラー文は変わらず。

import java.util.List; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import com.example.its.domain.auth.User.Authority; import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; @PreAuthorize("hasAuthority('ADMIN')") public List<User> findAll() { return userRepository.findAll(); } @PreAuthorize("hasAuthority('ADMIN')") public void create(String username, String password, String authority) { var encodePassword = passwordEncoder.encode(password); Authority auth = Authority.valueof("authority") userRepository.insert(username, encodePassword, auth); } }

②全てのファイルで定義しているauthoirtyのデータ型をString →Authorityに変更。
全く別のエラーに変わりましたので、対策せず。

以上、ご教授をお願い致します。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。