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

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

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

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

Java

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

Q&A

解決済

1回答

4340閲覧

Jacksonで自作クラスのリストをjsonへシリアライズする際にエラー

inzm13

総合スコア11

JSON

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

Java

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

0グッド

0クリップ

投稿2020/03/10 09:03

前提・実現したいこと

MyBatisを用いてDBからレコードを取得
DBから取得したレコードをパースして自作クラスのリストを作成
作成したリストをwriteValueAsStringを用いてjsonに変換

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

3 10, 2020 5:58:52 午後 org.apache.catalina.core.StandardWrapperValve invoke 重大: サーブレット [treatMember.GetMember] のServlet.service()が例外を投げました com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class treatMember.Member and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]) at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1191) at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:404) at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71) at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33) at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:4094) at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3404) at treatMember.GetMember.doGet(GetMember.java:45) at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:609) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)

該当のソースコード

Member.java(自作クラス)

public class Member { private final String memberName; private final String memberId; private final String projectId; /** * コンストラクタ */ public Member(String memberName, String memberId) { this.memberName = memberName; this.memberId = memberId; this.projectId = ""; }

getMember.java

public class GetMember extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Member> memberList = new ArrayList<Member>(); String projectId = request.getParameter("projectId"); try { memberList = getMember(projectId); } catch (Exception e) { e.printStackTrace(); System.out.println("DB接続エラー"); } ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(memberList); response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); response.getWriter().println(json); } /** * リクエストに設定されていたプロジェクトIDからプロジェクトの参画要員を取得する * * @param projectId プロジェクトID * @return */ private List<Member> getMember(String projectId) throws Exception { List<Member> memberList = new ArrayList<Member>(); try (InputStream in = GetMember.class.getResourceAsStream("/treatMember/mybatis-config.xml")) { // 設定ファイルからSqlSessionFactoryを作成 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); // SQqlSessionFactoryからSQLSessionを生成 try (SqlSession session = factory.openSession()) { // Mapperを取得 // ActorテーブルのMapperを取得します(4) SampleMapper map = session.getMapper(SampleMapper.class); // SQLSessionを使ってSQLを実行 List<Map<String, Object>> result = map.selectTest(projectId); for (Map<String, Object> row : result) { Member m = new Member(row.get("memberName").toString(), row.get("memberId").toString()); memberList.add(m); } } } return memberList; } }

試したこと

Member.java(自作クラス)のフィールドをpublic にし、getMember.javaでフィールドを直接扱うようにすればエラーは発生しないことを確認しました。
しかし、フィールドpublicにしてを直接操作するべきでないため上記のようにフィールドをprivateとしてコンストラクタで
初期化するようにした結果エラーが発生してしまい、それを回避するための解決法が思いつかず、質問させていただきました。

public class Member { public String memberName; public String memberId; public String projectId; }

getMember.javaのgetMemberメソッド

private List<Member> getMember(String projectId) throws Exception { List<Member> memberList = new ArrayList<Member>(); try (InputStream in = GetMember.class.getResourceAsStream("/treatMember/mybatis-config.xml")) { // 設定ファイルからSqlSessionFactoryを作成 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); // SQqlSessionFactoryからSQLSessionを生成 try (SqlSession session = factory.openSession()) { // Mapperを取得 // ActorテーブルのMapperを取得します(4) SampleMapper map = session.getMapper(SampleMapper.class); // SQLSessionを使ってSQLを実行 List<Map<String, Object>> result = map.selectTest(projectId); for (Map<String, Object> row : result) { Member m = new Member(); m.memberName = row.get("memberName").toString(); m.memberId = row.get("memberId").toString(); memberList.add(m); } } } return memberList; }

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

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

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

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

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

guest

回答1

0

自己解決

Member.java(自作クラス)にgetterを追加すれば解決しました。
解決済にさせていただきます。
もし、考えていただいた方がいらっしゃったらありがとうございました。

private final String memberName; private final String memberId; private final String projectId; public Member(String memberName, String memberId) { // レスポンスの文字列をJSONオブジェクトに変換 // とりあえずダミーで詰め込んでみる this.memberName = memberName; this.memberId = memberId; this.projectId = ""; } public String getMemberName() { return memberName; } public String getMemberId() { return memberId; } public String getProjectId() { return projectId; }

投稿2020/03/10 09:26

編集2020/03/10 09:28
inzm13

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.43%

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

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

質問する

関連した質問