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

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

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

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

Spring Boot

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

Q&A

1回答

2565閲覧

Spring boot @JsonComponent使用時のLocalDateTimeのFormat個別指定について

hinoko58

総合スコア112

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2019/01/04 02:53

@JsonComponentを使い、Json化しています。

参考サイト

java

1import com.fasterxml.jackson.core.JsonGenerator; 2import com.fasterxml.jackson.core.JsonParser; 3import com.fasterxml.jackson.databind.DeserializationContext; 4import com.fasterxml.jackson.databind.JsonDeserializer; 5import com.fasterxml.jackson.databind.JsonSerializer; 6import com.fasterxml.jackson.databind.SerializerProvider; 7import net.proto.qps.util.DtUtils; 8import org.springframework.boot.jackson.JsonComponent; 9 10import java.io.IOException; 11import java.time.LocalDateTime; 12import java.time.format.DateTimeFormatter; 13 14@JsonComponent 15public class LocalDateTimeJson { 16 17 public static class LocalDateTimeSerializer 18 extends JsonSerializer<LocalDateTime> { 19 @Override 20 public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 21 if (value == null) { 22 return; 23 } 24 gen.writeString(value.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS"))); 25 26 } 27 } 28 29 public static class LocalDateTimeDeserializer 30 extends JsonDeserializer<LocalDateTime> { 31 @Override 32 public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { 33 if (p.getText() == null) { 34 return null; 35 } 36 return DtUtils.toLocalDateTime(p.getText()); 37 } 38 } 39}

以下のクラスのmessageTime2は違う形式にしたいですが、どうもLocalDateTimeSerializer.serializeでは
常にyyyy/MM/dd HH:mm:ss.SSS形式にしているため、個別のフォーマットを指定できません。
※そもそも@JsonFormatが効かないかも

java

1import com.fasterxml.jackson.annotation.JsonFormat; 2import lombok.Data; 3 4import java.time.LocalDateTime; 5 6@Data 7public class PushChatDataDto { 8 9 private String pushType; 10 private Long roomId; 11 private Long sendUserId; 12 private String sendUserPeerId; 13 private String sendUserName; 14 private Long messageId; 15 @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss.SSS") 16 private LocalDateTime messageTime; 17 18 @JsonFormat(pattern = "yyyy/MM/dd HH:mm:ss") 19 private LocalDateTime messageTime2; 20 private String message; 21 22 23} 24

java

1import com.fasterxml.jackson.databind.ObjectMapper; 2import junit.framework.TestCase; 3import net.proto.qps.util.dto.PushChatDataDto; 4import org.junit.Test; 5import org.junit.runner.RunWith; 6import org.springframework.beans.factory.annotation.Autowired; 7import org.springframework.boot.test.context.SpringBootTest; 8import org.springframework.test.context.junit4.SpringRunner; 9 10import java.time.LocalDateTime; 11 12@RunWith(SpringRunner.class) 13@SpringBootTest 14public class ChatDataTest extends TestCase { 15 @Autowired 16 private ObjectMapper jacksonObjectMapper; 17 18 // JsonFormat効かない 19 @Test 20 public void test() throws Exception { 21 22 PushChatDataDto dto = new PushChatDataDto(); 23 dto.setPushType("test"); 24 dto.setRoomId(1L); 25 dto.setSendUserId(1L); 26 dto.setMessageTime(LocalDateTime.now()); 27 dto.setMessageTime2(LocalDateTime.now()); 28 String s = jacksonObjectMapper.writeValueAsString(dto); 29 System.out.println(s); 30 } 31}

上記のテストクラスを実行したら、MessageTime、MessageTime2の値の形式は同じです。
個別に指定したいですが、方法ありますか?

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

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

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

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

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

guest

回答1

0

テストケースの場合、出力値を一定にする必要があるので

LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoSecond) のように固定値を設定できるクラスを使用して Assert などでチェックしましょう

投稿2019/01/06 03:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/01/06 03:21

またドキュメント読む癖をつけましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問