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

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

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

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

Spring

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

Spring Boot

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

Q&A

解決済

3回答

2246閲覧

【SpringBoot】検索数値未入力時の表示処理

150be

総合スコア20

Java

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

Spring

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

Spring Boot

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

0グッド

0クリップ

投稿2019/02/07 08:13

編集2019/02/08 01:49

前提・実現したいこと

SpringBootで年齢の範囲検索に一致するデータを表示する機能を作成しています。
入力された値をコントローラーで受け取り、サービスクラスに飛ばして一致するデータを検索しています。
ただ、入力項目が無い時に以下のエラーが発生します。
実現したい事として、入力が無ければ年齢の下限は0、年齢の上限は99になって検索する処理にしたいです。

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

java.lang.NumberFormatException: For input string: "downage"

該当のソースコード

Service

1package com.×××.springboot; 2 3import java.util.List; 4 5import javax.persistence.EntityManager; 6import javax.persistence.PersistenceContext; 7import javax.persistence.Query; 8import javax.persistence.criteria.CriteriaBuilder; 9import javax.persistence.criteria.CriteriaQuery; 10import javax.persistence.criteria.Root; 11 12import org.springframework.stereotype.Service; 13 14@Service 15public class Service { 16 17 @PersistenceContext 18 private EntityManager entityManager; 19 20 @SuppressWarnings("unchecked") 21 public List<エンティティ名> getAll() { 22 return (List<エンティティ名>) entityManager.createQuery("from テーブル").getResultList(); 23 } 24 25 @SuppressWarnings("unchecked") 26 public List<エンティティ名> findByAge(int downage, int upage) { 27 return (List<エンティティ名>)entityManager 28 .createQuery("from テーブル名 where age >= :downage and age <= :upage") 29 .setParameter("downage", downage) 30 .setParameter("upage", upage) 31 .getResultList(); 32 } 33 34}

Controller

1package com.×××.springboot; 2 3//文字数の都合上、import関連は省略します。 4 5@Controller 6public class Controller { 7 8 @Autowired 9 Repository repository; 10 11 @Autowired 12 private Service service; 13 14 @PersistenceContext 15 EntityManager entityManager; 16 17 @RequestMapping(value = "/html", method = RequestMethod.GET) 18 public ModelAndView html(ModelAndView mav) { 19 mav.setViewName("age"); 20 mav.addObject("msg", "年齢検索画面です!"); 21 mav.addObject("value", ""); 22 Iterable<Age> list = dao.getAll(); 23 mav.addObject("datalist", list); 24 return mav; 25 } 26 27// 年齢の範囲検索機能 28 public ModelAndView searchAge(HttpServletRequest request, 29 ModelAndView mav) { 30 mav.setViewName("age"); 31 mav.addObject("msg", "検索結果です!"); 32 int downage = 0; 33 int upage = 99; 34 downage = Integer.parseInt(request.getParameter("downage")); 35 upage = Integer.parseInt(request.getParameter("upage")); 36 if( downage == upage ){ 37 mav = new ModelAndView("redirect:/html"); 38 }else{ 39 mav.addObject("value", ""); 40 Iterable<Age> list = service.findByAge(downage, upage); 41 mav.addObject("datalist", list); 42 } 43 return mav; 44 45 } 46}

html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4 <title>top page</title> 5 <meta http-equiv="Content-Type" 6 content="text/html; charset=UTF-8" /> 7</head> 8<body> 9 <h1 th:text="#{content.title}"></h1> 10 <p th:text="${msg}">ようこそ!</p> 11 <table> 12 <form action="/html" method="post" > 13 <tr><td><label for="age">年齢</label></td> 14 <td> 15 <input type="text" name="downage" size="2" /> 16 </td> 17 <td></td> 18 <td> 19 <input type="text" name="upage" size="2" />20 </td></tr> 21 <td> 22 <input type="submit" name="kensaku" value="検索" /> 23 </td> 24 </tr> 25 </form> 26 </table> 27 <table> 28 <tr><th><th>年齢</th> 29 <tr th:each="obj : ${datalist}"> 30 <td th:text="${obj.age}"></td> 31 </tr> 32 <tr> 33 <td> 34 <input type="submit" name="return" value="戻る" /> 35 </td> 36 </tr> 37 </table> 38</body> 39

試したこと

・intで取得するageの値をString.valueOfなどでString型へ変換。
その後、ageがnullだった時の処理を記載。

補足情報(FW/ツールのバージョンなど)

STS 3.9.2
maven 3.6.0
JDK 8

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

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

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

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

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

guest

回答3

0

ベストアンサー

javaぜんぜん分かんないんですが、回答依頼もらったんで雰囲気回答します。

エラーは多分Controllerの↓の

java

1 public ModelAndView searchAge(HttpServletRequest request, 2 ModelAndView mav) { 3 mav.setViewName("age"); 4 mav.addObject("msg", "検索結果です!"); 5 int downage = Integer.parseInt("downage"); 6 int upage = Integer.parseInt("upage"); 7 if( downage == "" || upage == "" ){ 8 mav = new ModelAndView("redirect:/html"); 9 }else{ 10 mav.addObject("value", ""); 11 Iterable<Age> list = service.findByAge(downage, upage); 12 mav.addObject("datalist", list); 13 } 14 return mav; 15 16 }

Integer.parseInt("downage")とかで起きてると思うんですよね。
多分ですよ、多分なんですが
int downage = Integer.parseInt(request.getParameter("downage"));とかじゃないかなー。

※同じことをupageにもしてください。ほんでとりあえずテスト段階では数値を入れてください。まず数値が入ってできる状態にして、次、未入力やりましょう。

わっかんないんで、違ってたらjavaの技術がある人をまってください。


java

1String downParam = request.getParameter("downage"); 2downage = downParam == "" ? 0 : Integer.parseInt(downParam);

投稿2019/02/07 08:36

編集2019/02/08 01:56
papinianus

総合スコア12705

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

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

azuapricot

2019/02/07 08:59

エラー的にはその通りなんですよね、 "downage"でパラメーターとれてるつもりが取れてないだけなので データを格納してあるところから "downage"をキーに値を引っ張ってこれればなんとかなりますよね(たぶん)
papinianus

2019/02/07 09:01

そうですね。たぶん…
150be

2019/02/07 10:28 編集

papinianusさん、ご丁寧にありがとうございます。 前提に漏れていましたが、適当な数値を入力しての範囲検索は行えています。 しかし、未入力になるとこうしたエラーが出現してしまいます。 "downage"が、パラメーター(空の値ですが)を上手いこと取得できていないんだと思います。
papinianus

2019/02/07 11:24

今このソースで同じことができているのですか?かつて動いたから未入力に対応できるように改変したのではなく?文字列リテラルが入力に変わるとは思えないのですが。 だったらjavaやばいですね。安易にすみませんでした。
150be

2019/02/08 01:50

papinianusさん ソースの修正を行いました。 現状のソースで、適当な数値を入力しての範囲検索を行えています。
papinianus

2019/02/08 01:56

こういう感じですかね。
guest

0

html

1<form action="@{/age}" th:object="${ageModel}"> 2 <input type="text" name="age" value="*{age}/> 3<ul th:if="${#fields.hasErrors('*')}"> 4 <li th:each="err : ${#fields.errors('*')}" th:text="${err}">Input is incorrect</li> 5</ul> 6</form>

の入力に対し、これを受けるControllerの実装は、最も簡単なのは、@ModelAttributeを付けた、パラメータを受け取るクラスを用意することです。

java

1import javax.validation.Valid; 2import javax.validation.constraints.Max; 3import javax.validation.constraints.Min; 4 5import org.springframework.stereotype.Controller; 6import org.springframework.validation.BindingResult; 7import org.springframework.web.bind.annotation.GetMapping; 8import org.springframework.web.bind.annotation.ModelAttribute; 9import org.springframework.web.bind.annotation.RequestMapping; 10import org.springframework.web.servlet.ModelAndView; 11 12import lombok.Data; 13import lombok.extern.log4j.Log4j2; 14 15 16@Controller 17@RequestMapping("/age") 18@Log4j2 19public class AgeController { 20 @GetMapping 21 public ModelAndView check(ModelAndView mnv, @Valid @ModelAttribute AgeModel age, BindingResult bindingResult) { 22 if (bindingResult.hasFieldErrors()) { 23 log.warn("bindingResult : {}" , bindingResult.getAllErrors()); 24 } 25 26 mnv.setViewName("age"); 27 return mnv; 28 } 29 30 @Data 31 public static class AgeModel { 32 @Max(value=30) 33 @Min(value=20) 34 private int age; 35 } 36}

投稿2019/02/07 16:00

A-pZ

総合スコア12011

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

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

0

int downage = Integer.parseInt("downage");

今あなたは downageという文字列を数値に変換しようとしています。
そりゃ怒られますよね。
downageなんていう英語を数字に変換できるわけないのですから

投稿2019/02/07 08:25

azuapricot

総合スコア2341

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

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

azuapricot

2019/02/07 08:29

ただ「入力項目がないときに」このエラーが起こるのでしょうか? 今の段階だといつでもエラーおきそうですけど・・・。 (あと、入力値が空っぽのときにエラー回避したいのなら、入力値を変換する前にNULLチェックいれなきゃだめだと思いますよ。 NULLを変換しようとするとNullPointerExceptionが起こってしまいますし。) なので↓ ・intで取得するageの値をString.valueOfなどでString型へ変換。 その後、ageがnullだった時の処理を記載。 この対処法でどうなるかはわかりませんが、順番が逆だと思います。 ageがNULLまたは空文字だったときの処理を書いたあとで、変換処理しなければいけないのでは?
azuapricot

2019/02/07 08:30

(再現してないのでパッと見の感想です。間違ってたらすいません)
150be

2019/02/07 10:34

azuapricotさん、ご丁寧にありがとうございます。 htmlにもdownageを記載しているため、入力された値がdownage内に入るデータの流れになっています。 そのため、前提で漏れていましたが、適当な数値を入れて検索処理をかけると、その範囲のデータが抽出されています。ただ、未入力の時がどうしてもエラーで引っかかるのです。 なるほど、順番に関してもう一度考え直して試してみます。
azuapricot

2019/02/08 02:07 編集

あぁ。request.getParameterしてたんですね。 それで、値がとれなかったときにエラーが起こると。 昨日も述べましたが、変換部分でNumberFormatExceptionが起こるのでは? Integer.parseInt(request.getParameter("downage"))←ここです Integer.parseInt(null); //NumberFormatExceptionで落ちます Integer.parseInt(""); //NumberFormatExceptionで落ちます なので、null、もしくは空文字のときは変換処理をせず画面に戻すような処理をいれないと、エラーとなるでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問