前提・実現したいこと
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; }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。