Code Monkey home page Code Monkey logo

Comments (7)

lilliCao avatar lilliCao commented on July 29, 2024

I tested the json-module.

    <dependency>
      <groupId>com.devonfw.java.modules</groupId>
      <artifactId>devon4j-json</artifactId>
      <version>2021.04.003</version>
    </dependency>
@Named("ApplicationObjectMapperFactory")
public class ApplicationObjectMapperFactory extends ObjectMapperFactory {
    public ApplicationObjectMapperFactory() {

        super();
        SimpleModule module = getExtensionModule();
        // register spring-data Pageable
        module.addSerializer(Pageable.class, new PageableJsonSerializer());
        module.addDeserializer(Pageable.class, new PageableJsonDeserializer());
    }
}

and inject custom mapper to resteasy

@Component
@Provider
@Consumes({"application/json", "application/*+json", "text/json"})
@Produces({"application/json", "application/*+json", "text/json"})
public class CustomJacksonJsonProvider extends ResteasyJackson2Provider {

    @Inject
    ObjectMapperFactory objectMapperFactory;

    @Override
    public ObjectMapper locateMapper(Class<?> type, MediaType mediaType) {
        ObjectMapper om = objectMapperFactory.createInstance();
        return om;
    }
}

Result:

  • the page result can be customized BUT it only works in jvm mode and NOT in native mode.

from devon4quarkus.

GuentherJulian avatar GuentherJulian commented on July 29, 2024

I think you do not simple can use the devon4j-json module in the Quarkus context. You have to implement the ObjectMapperCustomizer (io.quarkus.jackson.ObjectMapperCustomizer) as described here. Then you can add a custom serializer in the customize method.

@Override
public void customize(ObjectMapper objectMapper) {
    SimpleModule module = new SimpleModule();
    module.addSerializer(Page.class, new JsonSerializer<Page>() {

        @Override
	public void serialize(Page value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            ...
        }
    });
    objectMapper.registerModule(module);
}

from devon4quarkus.

lilliCao avatar lilliCao commented on July 29, 2024

@GuentherJulian you are right. That should do it. Thanks. I saw the problem now, even the json-module does not provide a serializer for Page.class (only Pagable.class)

from devon4quarkus.

lilliCao avatar lilliCao commented on July 29, 2024

Implement custom mapper using io.quarkus.jackson.ObjectMapperCustomizer (code in this branch)

the custom serializer for Page.class. We can customize further here if wanted

public class PageSerializer extends JsonSerializer<Page> {

    @Override
    public void serialize(Page page, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (page != null) {
            jsonGenerator.writeStartObject();

            jsonGenerator.writeObjectField("content", page.getContent());
            jsonGenerator.writeObjectField("pageable", page.getPageable());
            jsonGenerator.writeBooleanField("last", page.isLast());
            jsonGenerator.writeNumberField("totalPages", page.getTotalPages());
            jsonGenerator.writeNumberField("totalElements", page.getTotalElements());
            jsonGenerator.writeBooleanField("first", page.isFirst());
            jsonGenerator.writeNumberField("numberOfElements", page.getNumberOfElements());
            jsonGenerator.writeObjectField("sort", page.getSort());
            jsonGenerator.writeNumberField("number", page.getNumber());
            jsonGenerator.writeNumberField("size", page.getSize());
            jsonGenerator.writeBooleanField("empty", page.isEmpty());

            jsonGenerator.writeEndObject();
        }
    }
}

register custom serializer to object mapper

@Singleton
public class CustomObjectMapper implements ObjectMapperCustomizer {

    @Override
    public void customize(ObjectMapper objectMapper) {
        SimpleModule module = new SimpleModule();
        module.addSerializer(Page.class, new PageSerializer());
        objectMapper.registerModule(module);
    }
}

Result:

  • paging works both in jvm and native mode with Page<> as return type in RestService

@GuentherJulian should this be sufficient? We can create another issue to refactor the sample app.

from devon4quarkus.

GuentherJulian avatar GuentherJulian commented on July 29, 2024

@GuentherJulian should this be sufficient? We can create another issue to refactor the sample app.

Great! Yes, please create a following task to refactor the rest service.

from devon4quarkus.

lilliCao avatar lilliCao commented on July 29, 2024

Refactoring the sample app should follow by this issue

from devon4quarkus.

sobkowiak avatar sobkowiak commented on July 29, 2024

It looks ok for me

from devon4quarkus.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.