Skip to content

JsonMappingException on UI render #630

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
jasonab opened this issue Apr 30, 2020 · 10 comments
Closed

JsonMappingException on UI render #630

jasonab opened this issue Apr 30, 2020 · 10 comments
Labels
bug Something isn't working

Comments

@jasonab
Copy link

jasonab commented Apr 30, 2020

Using version 1.3.6

Describe the bug
When trying to render /swagger-ui.html, receive the following error:
There was an unexpected error (type=Internal Server Error, status=500).
com.fasterxml.jackson.databind.JsonMappingException: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) (through reference chain: io.swagger.v3.oas.models.OpenAPI["paths"]->io.swagger.v3.oas.models.Paths["/keywordGroups/{groupName}"]->io.swagger.v3.oas.models.PathItem["get"]->io.swagger.v3.oas.models.Operation["responses"]->io.swagger.v3.oas.models.responses.ApiResponses["null"])

Expected behavior
Page would render Swagger documentation

I've removed all Swagger annotations from the code in question, leaving only Spring REST-oriented annotations, but cannot seem to get past this error. The method in question returns a ResponseEntity object, if that might matter.

I've also tried adding a full set of @operation + @ApiResponse objects, but it does not get rid of this error.

@bierchitekt
Copy link

Same issue here when upgrading from 1.3.4 to 1.3.6

@bnasslahsen
Copy link
Collaborator

@jasonab and @abadurczyk,

If you are reporting a bug, please help to speed up problem diagnosis by providing as much information as possible:

  • Provide with a sample code (HelloController) or Test that reproduces the problem

@vicentesd93
Copy link

Same issue here when upgrading from 1.3.1 to 1.3.6

Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) (through reference chain: io.swagger.v3.oas.models.OpenAPI["paths"]->io.swagger.v3.oas.models.Paths["/"]->io.swagger.v3.oas.models.PathItem["get"]->io.swagger.v3.oas.models.Operation["responses"]->io.swagger.v3.oas.models.responses.ApiResponses["null"])

@bnasslahsen
Copy link
Collaborator

bnasslahsen commented Apr 30, 2020

@vicentesd93,

Is it the same issue with v1.3.7, which integrates some enhancements?
If its still the case, can you please provide more information about your context:

  • Provide with a sample code (HelloController) or Test that reproduces the problem

@bnasslahsen
Copy link
Collaborator

This ticket will be closed, and there is no need to reopen a new ticket for the same issue.
You can add your comments if needed and we will follow it.

@vicentesd93
Copy link

vicentesd93 commented Apr 30, 2020

@bnasslahsen

Yes we tested it and it plays.

My example:

import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.enums.ParameterStyle;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;

@Controller
@RequestMapping("/api")
@OpenAPIDefinition(info = @Info(title = "API Examples", version = "1.0"), tags = @Tag(name = "Operations"))
public interface IExamplesApi {

@Operation(operationId = "getExample", description = "Get examples", tags = {
			"Operations", })
	@ApiResponses(value = {
			@ApiResponse(responseCode = "200", description = "List of examples.", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, array = @ArraySchema(schema = @Schema(implementation = Examples.class)))),
			@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = Error.class))) })
	@RequestMapping(value = "/examples", produces = {
			MediaType.APPLICATION_JSON_VALUE }, method = RequestMethod.GET)
	ResponseEntity<List<Examples>> getExample(
			@Parameter(description = "user id", required = true, in = ParameterIn.PATH, style = ParameterStyle.SIMPLE, schema = @Schema(type = "number")) @PathVariable("userid") BigDecimal userid);

Thanks for the reply.

@jasonab

This comment was marked as abuse.

@bnasslahsen
Copy link
Collaborator

@jasonab,

Your issue is unable to reproduce...

If you are reporting a bug, please help to speed up problem diagnosis by providing as much information as possible: As mentionned before,

  • Provide with a sample code (HelloController) or Test that reproduces the problem

@springdoc springdoc deleted a comment from jasonab Apr 30, 2020
@bierchitekt
Copy link

bierchitekt commented Apr 30, 2020

Version 1.3.7 does not fix it.

How to reproduce:
application.yml

springdoc:
  pathsToMatch: /v1/**

Controller:

@RestController
@RequestMapping("/v1")
public class FooController {
    @PostMapping("foo")
    public String create(@RequestBody String foo) {
        return "foo";
    }
}

Errorhandler:

@ControllerAdvice(assignableTypes = FooController.class)
public class FooErrorHandler {

    @ExceptionHandler
    public ResponseEntity<String> storeAssignmentPublishingError(Exception e) {
        return new ResponseEntity<>("foo", HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

Exception:

ERROR o.a.c.c.C.[.[.[.[dispatcherServlet].log - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception com.fasterxml.jackson.databind.JsonMappingException: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) (through reference chain: io.swagger.v3.oas.models.OpenAPI["paths"]->io.swagger.v3.oas.models.Paths["/v1/foo"]->io.swagger.v3.oas.models.PathItem["post"]->io.swagger.v3.oas.models.Operation["responses"]->io.swagger.v3.oas.models.responses.ApiResponses["null"]) at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:288) at com.fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1251) at com.fasterxml.jackson.databind.SerializerProvider.reportMappingProblem(SerializerProvider.java:1145) at com.fasterxml.jackson.databind.ser.impl.FailingSerializer.serialize(FailingSerializer.java:35) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeOptionalFields(MapSerializer.java:781) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:639) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:33) at com.fasterxml.jackson.databind.SerializerProvider.defaultSerializeValue(SerializerProvider.java:1033) at io.swagger.v3.core.jackson.ApiResponsesSerializer.serialize(ApiResponsesSerializer.java:35) at io.swagger.v3.core.jackson.ApiResponsesSerializer.serialize(ApiResponsesSerializer.java:11) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeOptionalFields(MapSerializer.java:782) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:639) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:33) at com.fasterxml.jackson.databind.SerializerProvider.defaultSerializeValue(SerializerProvider.java:1033) at io.swagger.v3.core.jackson.PathsSerializer.serialize(PathsSerializer.java:35) at io.swagger.v3.core.jackson.PathsSerializer.serialize(PathsSerializer.java:11) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:722) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:166) 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:4110) at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3413) at org.springdoc.webmvc.api.OpenApiResource.openapiJson(OpenApiResource.java:110) at org.springdoc.webmvc.api.MultipleOpenApiResource.openapiJson(MultipleOpenApiResource.java:128) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) 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:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:109) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 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:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:834)

I hope you can fix it with these infos and thanks for your help :)

@bnasslahsen
Copy link
Collaborator

bnasslahsen commented Apr 30, 2020

@jasonab,

The cause is that on the exception handler there is no @ResponseStatus.
The better solution is to add in order to display it in the swagger documentation.

@ControllerAdvice(assignableTypes = HelloController.class)
public class FooErrorHandler {

	@ExceptionHandler
	@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
	public ResponseEntity<String> storeAssignmentPublishingError(Exception e) {
		return new ResponseEntity<>("foo", HttpStatus.INTERNAL_SERVER_ERROR);
	}
}

Anyway, the fix is now added to master, to ignore the ExceptionHandler if ResponseStatus is absent.

@bnasslahsen bnasslahsen changed the title Migrating from SpringFox -- JsonMappingException on UI render JsonMappingException on UI render Apr 30, 2020
@bnasslahsen bnasslahsen added the bug Something isn't working label Jan 10, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

4 participants