티스토리 뷰

들어가며

  • Class를 Serialize 하는 과정에서 아래와 같은 에러가 발생하였다. 
Exception in thread "Thread-5" org.springframework.messaging.converter.MessageConversionException: Could not write JSON: No serializer found for class com.tact.io.domain.socket.WaitMessage and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.tact.io.domain.socket.SocketMessage["body"]); nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.tact.io.domain.socket.WaitMessage and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.tact.io.domain.socket.SocketMessage["body"])
	at org.springframework.messaging.converter.MappingJackson2MessageConverter.convertToInternal(MappingJackson2MessageConverter.java:284)
	at org.springframework.messaging.converter.AbstractMessageConverter.toMessage(AbstractMessageConverter.java:201)
	at org.springframework.messaging.converter.CompositeMessageConverter.toMessage(CompositeMessageConverter.java:96)
	at org.springframework.messaging.core.AbstractMessageSendingTemplate.doConvert(AbstractMessageSendingTemplate.java:181)
	at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:150)
	at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:129)
	at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:122)
	at com.tact.io.service.GamePool.sendMessage(GamePool.java:189)
	at com.tact.io.service.GamePool.run(GamePool.java:49)
	at java.lang.Thread.run(Thread.java:748)
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.tact.io.domain.socket.WaitMessage and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.tact.io.domain.socket.SocketMessage["body"])
	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:313)
	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.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727)
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719)
	at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.tact.io.domain.socket.WaitMessage and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.tact.io.domain.socket.SocketMessage["body"])

	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
	at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2655)
	at org.springframework.messaging.converter.MappingJackson2MessageConverter.convertToInternal(MappingJackson2MessageConverter.java:268)
	... 9 more

해결 방법

  • 문제의 원인은 필드가 없는 클래스를 Serialize하려고 하기 때문이었다. 
  • 해결 방법은 두가지가 있다.

어노테이션 추가

  • 해당 클래스에 아래의 어노테이션을 추가해준다.
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

application.properties 수정

  • application.properties 파일에 아래 설정을 추가해준다.
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

관련글

 

[SpringBoot] Application 실행시 다양한 시점의 Event Listener 등록하는 방법

들어가며 스프링 부트에서는 Application과 관련하여 다양한 시점에 Event Listener를 등록할 수가 있다. 자세한 내용은 이 곳을 참고 ApplicationStartingEvent, ApplicationEnvironmentPreparedEvent 등등 사용..

jinseongsoft.tistory.com

 

[SpringBoot] properties 파일 정의된 프로퍼티 클래스로 묶어서 사용하는 방법 (@ConfigurationProperties 사용)

들어가며 application.properties 에 설정한 프로퍼티중 여러 값이 같은 key로 묶어서 하나의 Bean으로 등록하는 방법이 있다. 방법 @ConfigurationProperties application.properties 파일에 같은 key로 묶인 프..

jinseongsoft.tistory.com

 

[Spring Boot] ApplicationArguments 사용법

들어가며 SpringBoot에서 제공해주는 ApplicationArguments를 통해서 프로그램 argument를 간편하게 가져와서 사용하는 방법을 알아보도록 한다. Program arguments Java 프로그램을 실행할 때 실행 옵션에 Progra..

jinseongsoft.tistory.com


끝으로

이 글이 도움이 되었다면, 하단의 Google 광고 👎👎👎 한번씩 클릭 부탁 드립니다. 🙏🙏🙏

광고 클릭은 많은 힘이 됩니다! 

 

반응형
댓글