[ https://issues.apache.org/jira/browse/CXF-8116?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16932441#comment-16932441 ]
Marco Tenti edited comment on CXF-8116 at 9/20/19 12:45 PM: ------------------------------------------------------------ For anyone want to remove the "default" i have success with these two solution: Simply add this provider: {code} <bean id="swaggerSerializersProvider" class="io.swagger.jaxrs.listing.SwaggerSerializers" /> {code} or if you want i have success with this custom version of the Jackson Json Provider {code:java} import java.io.IOException; import javax.ws.rs.Consumes; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Provider; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Service; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; /** * @author ddrag...@gmail.com */ @Provider @Consumes(MediaType.WILDCARD) // NOTE: required to support "non-standard" JSON variants @Produces(MediaType.WILDCARD) @Component(immediate = true, metatype = false) @Service(value = {CustomJacksonJaxbJsonProvider.class}) public class CustomJacksonJaxbJsonProvider extends com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider implements ContextResolver<ObjectMapper>{ private static final ObjectMapper OBJECT_MAPPER = buildObjectMapper(); public CustomJacksonJaxbJsonProvider() { super(); super.setMapper(OBJECT_MAPPER); } public static ObjectMapper buildObjectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT); //mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); mapper.configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, false); //mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true); //mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); //DROP ROOT ELEMENT //https://www.baeldung.com/jackson-jsonmappingexception //mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); //https://stackoverflow.com/questions/15261456/how-do-i-disable-fail-on-empty-beans-in-jackson/15261908#15261908 //mapper.setVisibility(PropertyAccessor.GETTER, Visibility.NONE); //mapper.setVisibility(PropertyAccessor.SETTER, Visibility.NONE); //mapper.setVisibility(PropertyAccessor.CREATOR, Visibility.NONE); // Michal Gajdos //mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); //mapper.configure(SerializationFeature.INDENT_OUTPUT, true); // mapper.withFieldVisibility(JsonAutoDetect.Visibility.ANY) // .withGetterVisibility(JsonAutoDetect.Visibility.NONE) // .withSetterVisibility(JsonAutoDetect.Visibility.NONE) // .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); //https://stackoverflow.com/questions/11757487/how-to-tell-jackson-to-ignore-a-field-during-serialization-if-its-value-is-null mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() { @Override public void serialize(Object obj, JsonGenerator jsonGen, SerializerProvider unused) throws IOException { //IGNORES NULL VALUES! } }); return mapper; } @Override public ObjectMapper getContext(final Class<?> type) { // return new ObjectMapper() // .configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true) // .configure(SerializationFeature.INDENT_OUTPUT, true); return OBJECT_MAPPER; } } {code} was (Author: 4535992): For anyone want to remove the "default" i have success with this two solution: Simply add this provider: {code} <bean id="swaggerSerializersProvider" class="io.swagger.jaxrs.listing.SwaggerSerializers" /> {code} or i have success with this custom version of the Jackson Json Provider {code:java} import java.io.IOException; import javax.ws.rs.Consumes; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Provider; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Service; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; /** * @author ddrag...@gmail.com */ @Provider @Consumes(MediaType.WILDCARD) // NOTE: required to support "non-standard" JSON variants @Produces(MediaType.WILDCARD) @Component(immediate = true, metatype = false) @Service(value = {CustomJacksonJaxbJsonProvider.class}) public class CustomJacksonJaxbJsonProvider extends com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider implements ContextResolver<ObjectMapper>{ private static final ObjectMapper OBJECT_MAPPER = buildObjectMapper(); public CustomJacksonJaxbJsonProvider() { super(); super.setMapper(OBJECT_MAPPER); } public static ObjectMapper buildObjectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT); //mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); mapper.configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, false); //mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true); //mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); //DROP ROOT ELEMENT //https://www.baeldung.com/jackson-jsonmappingexception //mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); //https://stackoverflow.com/questions/15261456/how-do-i-disable-fail-on-empty-beans-in-jackson/15261908#15261908 //mapper.setVisibility(PropertyAccessor.GETTER, Visibility.NONE); //mapper.setVisibility(PropertyAccessor.SETTER, Visibility.NONE); //mapper.setVisibility(PropertyAccessor.CREATOR, Visibility.NONE); // Michal Gajdos //mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); //mapper.configure(SerializationFeature.INDENT_OUTPUT, true); // mapper.withFieldVisibility(JsonAutoDetect.Visibility.ANY) // .withGetterVisibility(JsonAutoDetect.Visibility.NONE) // .withSetterVisibility(JsonAutoDetect.Visibility.NONE) // .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); //https://stackoverflow.com/questions/11757487/how-to-tell-jackson-to-ignore-a-field-during-serialization-if-its-value-is-null mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() { @Override public void serialize(Object obj, JsonGenerator jsonGen, SerializerProvider unused) throws IOException { //IGNORES NULL VALUES! } }); return mapper; } @Override public ObjectMapper getContext(final Class<?> type) { // return new ObjectMapper() // .configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true) // .configure(SerializationFeature.INDENT_OUTPUT, true); return OBJECT_MAPPER; } } {code} > Can't find a way to integrate the webjars "swaggerui" on OSGI Camel CXF > Project > ------------------------------------------------------------------------------- > > Key: CXF-8116 > URL: https://issues.apache.org/jira/browse/CXF-8116 > Project: CXF > Issue Type: Bug > Components: Bus, Documentation, JAX-RS, OSGi > Affects Versions: 3.2.7 > Reporter: Marco Tenti > Priority: Major > > Hi, i really need a full example for integrate the webjars "swaggerui" on > OSGI Camel CXF Project. > I followed the documentation and add the webjars swagger-ui on compile mode > on my pom.xml > I don't know why but my "Swagger2Feature" generate only the swagger.json > endpoint and never load the SwaggerUi page. > Here the blueprint.xml configuration i'm try to use: > {code:xml} > <cxf:rsServer > address="${https.serviceHost}:${https.servicePort}/cxf/my/rest" > id="rsServerTestServiceEndpointSSL" > loggingFeatureEnabled="true" loggingSizeLimit="20" > serviceClass="bug.test.endpoint.TestEndpoint" > staticSubresourceResolution="true"> > <cxf:serviceBeans> > <ref component-id="testServiceEndpointID"/> > </cxf:serviceBeans> > <cxf:inInterceptors> > <ref component-id="loggingInInterceptor"/> > </cxf:inInterceptors> > <cxf:outInterceptors> > <ref component-id="loggingOutInterceptor"/> > </cxf:outInterceptors> > <cxf:providers> > <ref component-id="jacksonJsonProvider"/> > <ref component-id="jacksonJaxbXMLProvider"/> > <ref component-id="multipartProvider" /> > <ref component-id="crossOriginResourceSharingFilterProvider"/> > </cxf:providers> > <cxf:features> > <ref component-id="loggingFeature"/> > <bean id="swagger2Feature" > class="org.apache.cxf.jaxrs.swagger.Swagger2Feature"><!-- > init-method="findSwaggerUiRoot" --> > <property name="host" > value="${https.serviceHost}:${https.servicePort}"/> > <property name="basePath" > value="${https.serviceHost}:${https.servicePort}/cxf/my/rest"/> > <property name="usePathBasedConfig" value="true" /> > <!-- > <property name="runAsFilter" value="true" /> > <property name="title" value="RESTful Service (swagger v2.0) > :: Signature Service"/> > <property name="description" value="Description Signature > Service"/> > <property name="version" value="1.0"/> > <property name="contact" value="XXXXXXXXXXXXXXXXXXX"/> > <property name="prettyPrint" value="true"/> > <property name="schemes"> > <array value-type="java.lang.String"> > <value>http</value> > <value>https</value> > </array> > </property> > <property name="scanAllResources" value="true"/> > <property name="swaggerUiVersion" value="true"/> > <property name="swaggerUiMavenGroupAndArtifact" > value="org.webjars/swagger-ui"/> > <property name="swaggerUiVersion" value="3.13.0"/> > --> > <!-- <property name="scan" value="true"/> --> > </bean> > </cxf:features> > </cxf:rsServer> > {code} > i even get this exception , but i don't know how resolve: > {code} > org.apache.cxf.interceptor.Fault: Direct self-reference leading to cycle > (through reference chain: > org.apache.cxf.message.MessageContentsList[1]->org.apache.cxf.jaxrs.swagger.SyntheticServletConfig["servletContext"]->io.undertow.servlet.spec.ServletContextImpl["deployment"]->io.undertow.servlet.core.DeploymentImpl["deploymentInfo"]->io.undertow.servlet.api.DeploymentInfo["classLoader"]->org.apache.camel.core.osgi.utils.BundleDelegatingClassLoader["bundle"]->org.apache.felix.framework.BundleImpl["bundle"]) > while invoking public javax.ws.rs.core.Response > io.swagger.jaxrs.listing.ApiListingResource.getListing(javax.ws.rs.core.Application,javax.servlet.ServletConfig,javax.ws.rs.core.HttpHeaders,javax.ws.rs.core.UriInfo,java.lang.String) > with params > [org.apache.cxf.jaxrs.swagger.Swagger2Feature$DefaultApplication@7fc8f668, > org.apache.cxf.jaxrs.swagger.SyntheticServletConfig@470a7e15, > org.apache.cxf.jaxrs.impl.HttpHeadersImpl@237f91e8, > org.apache.cxf.jaxrs.impl.UriInfoImpl@1ade3492, json]. > at > org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:166) > at > org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:140) > at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:193) > at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:103) > at > org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59) > at > org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96) > at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) > at > org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:278) > at > org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78) > at > org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267) > at > org.apache.cxf.transport.http_undertow.UndertowHTTPDestination.doService(UndertowHTTPDestination.java:200) > at > org.apache.cxf.transport.http_undertow.CxfUndertowServlet.invoke(CxfUndertowServlet.java:52) > at > org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:301) > at > org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:225) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:645) > at > org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:276) > at > io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74) > at > io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) > at > io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68) > at > io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) > at > io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) > at > io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) > at > io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292) > at > io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81) > at > io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138) > at > io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135) > at > io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48) > at > io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) > at > io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272) > at > io.undertow.servlet.handlers.ServletInitialHandler.dispatchToPath(ServletInitialHandler.java:209) > at > io.undertow.servlet.spec.AsyncContextImpl$2$1.handleRequest(AsyncContextImpl.java:194) > at io.undertow.server.Connectors.executeRootHandler(Connectors.java:364) > at > io.undertow.servlet.spec.AsyncContextImpl$2.run(AsyncContextImpl.java:191) > at > io.undertow.servlet.spec.AsyncContextImpl$6.run(AsyncContextImpl.java:485) > at > io.undertow.servlet.spec.AsyncContextImpl$TaskDispatchRunnable.run(AsyncContextImpl.java:604) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) > at java.lang.Thread.run(Thread.java:748) > Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: > Direct self-reference leading to cycle (through reference chain: > org.apache.cxf.message.MessageContentsList[1]->org.apache.cxf.jaxrs.swagger.SyntheticServletConfig["servletContext"]->io.undertow.servlet.spec.ServletContextImpl["deployment"]->io.undertow.servlet.core.DeploymentImpl["deploymentInfo"]->io.undertow.servlet.api.DeploymentInfo["classLoader"]->org.apache.camel.core.osgi.utils.BundleDelegatingClassLoader["bundle"]->org.apache.felix.framework.BundleImpl["bundle"]) > 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.ser.BeanPropertyWriter._handleSelfReference(BeanPropertyWriter.java:944) > at > com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:721) > 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.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.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.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.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.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.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.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1396) > at > com.fasterxml.jackson.databind.ObjectWriter._configAndWriteValue(ObjectWriter.java:1120) > at > com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:950) > at > org.apache.camel.component.jackson.JacksonDataFormat.marshal(JacksonDataFormat.java:166) > at > org.apache.camel.processor.MarshalProcessor.process(MarshalProcessor.java:69) > at > org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:181) > at > org.apache.camel.processor.interceptor.HandleFaultInterceptor.process(HandleFaultInterceptor.java:42) > at > org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:110) > at > org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548) > at > org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) > at org.apache.camel.processor.Pipeline.process(Pipeline.java:138) > at org.apache.camel.processor.Pipeline.process(Pipeline.java:101) > at > org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) > at > org.apache.camel.component.cxf.jaxrs.CxfRsInvoker.asyncInvoke(CxfRsInvoker.java:95) > at > org.apache.camel.component.cxf.jaxrs.CxfRsInvoker.performInvocation(CxfRsInvoker.java:69) > at > org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) > at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:193) > at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:103) > at > org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59) > at > org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96) > at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) > at > org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) > at > org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267) > at > org.apache.cxf.transport.http_undertow.UndertowHTTPDestination.doService(UndertowHTTPDestination.java:200) > at > org.apache.cxf.transport.http_undertow.UndertowHTTPHandler.handleRequest(UndertowHTTPHandler.java:123) > at io.undertow.server.Connectors.executeRootHandler(Connectors.java:364) > at > io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830) > ... 3 more > {code} > *+The full test project can be found here:+* > https://github.com/p4535992/bug-load-swaggerui-blueprint > i'm desperated to make this work. > Anyone can provide a full example for the integration of the swaggerui ? -- This message was sent by Atlassian Jira (v8.3.4#803005)