Search code examples
javamicronautr2dbc

Micronaut error on calling repositry Context does not contain key: io.micronaut.tx.STATUS


import io.micronaut.core.annotation.NonNull;
import io.micronaut.data.annotation.GeneratedValue;
import io.micronaut.data.annotation.Id;
import io.micronaut.data.annotation.MappedEntity;
import io.micronaut.data.model.query.builder.sql.Dialect;
import io.micronaut.data.r2dbc.annotation.R2dbcRepository;
import io.micronaut.data.repository.reactive.ReactiveStreamsCrudRepository;
import io.micronaut.http.annotation.Body;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Post;
import io.micronaut.runtime.Micronaut;
import lombok.RequiredArgsConstructor;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class Application {
    public static void main(String[] args) {
        Micronaut.run(Application.class, args);
    }
}

@Controller
@RequiredArgsConstructor
class CustomerController {

    private final CustomerRepository customerRepository;

    @Get
    public Flux<Customer> getAll() {
        return customerRepository.findAll();
    }

    @Get("/test")
    public Mono<Customer> test() {
        return Mono.from(customerRepository.findById(1L)).map(e -> {
            System.out.println(e);
            return e;
        });
//        System.out.println(customerRepository);
//        return Mono.just("TEST");
    }

    @Post
    public Mono<Customer> create(@Body Customer customer) {
        Customer saveCustomer = new Customer(customer.getName(), customer.getSurname());

        return Mono.from(customerRepository.save(saveCustomer));
    }
}

//@R2dbcRepository(dialect = Dialect.SQL_SERVER)
interface CustomerRepository extends ReactiveStreamsCrudRepository<Customer, Long> {
    //    @NonNull
//    @Override
//    Mono<Customer> findById(@NonNull @NotNull Long id);
//
//    @NonNull
//    @Override
//    Mono<Customer> save(@NonNull @NotNull Customer customer);
//
    @NonNull
    @Override
    Flux<Customer> findAll();
}


@MappedEntity("customer")
class Customer {
    @Id
    @GeneratedValue
    private Long id;


    private final String name;
    private final String surname;

    public Customer(String name, String surname) {
        this.name = name;
        this.surname = surname;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public String getSurname() {
        return surname;
    }

}

** Trying to call a repositry through endpoint but keep getting error **

Context does not contain key: io.micronaut.tx.STATUS
    at reactor.util.context.Context1.get(Context1.java:67)
    at io.micronaut.data.r2dbc.operations.DefaultR2dbcRepositoryOperations.lambda$withTransaction$27(DefaultR2dbcRepositoryOperations.java:441)
    at reactor.core.publisher.FluxDeferContextual.subscribe(FluxDeferContextual.java:49)
    at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
    at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:54)
    at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)

Solution

  • I've faced the same issue.

    Check this:

    @Get
        public Flowable<Customer> getAll() {
            return Flowable.fromPublisher(customerRepository.findAll());
        }
    

    and where is Mono use Single.fromPublisher(yourMono)