lord.didger
lord.didger

Reputation: 1407

return OK (200) instead of NO_CONTENT (204)

I have a few methods in my REST api that return void. By default jersey sets 204 for such responses. I know if I return any not null object response is 200, however, I would like to set status code to 200 without necessity of modifying these methods. How can I achieve that?

Upvotes: 3

Views: 4445

Answers (1)

Lukasz Wiktor
Lukasz Wiktor

Reputation: 20422

If you don't mind overriding every 204 response to 200 then you can use a filter:

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;

@Provider
public class NoContentToOkResposeFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        if (responseContext.getStatus() == 204) {
            responseContext.setStatus(200);
        }
    }
}

UPDATE

If you prefer a more customizable solution then you can activate the filter with an annotation and a DynamicFeature.

Annotation:

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target(METHOD)
@Retention(RUNTIME)
public @interface ResponseStatus {

    int value() default 200;
}

Filter:

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;

public class OverrideResponseStatusFilter implements ContainerResponseFilter {

    private final int statusCode;

    public OverrideResponseStatusFilter(int statusCode) {
        this.statusCode = statusCode;
    }

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        responseContext.setStatus(statusCode);
    }
}

DynamicFeature:

import javax.ws.rs.container.DynamicFeature;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.ext.Provider;

@Provider
public class ResponseStatusDynamicFeature implements DynamicFeature {

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {
        ResponseStatus responseStatus = (ResponseStatus) resourceInfo.getResourceMethod().getAnnotation(ResponseStatus.class);
        if (responseStatus != null) {
            context.register(new OverrideResponseStatusFilter(responseStatus.value()));
        }
    }
}

And finally annotate your resource method with @ResponseStatus(200):

@GET
@Path("/nothing")
@ResponseStatus(200)
public void nothing() {
}

Upvotes: 4

Related Questions