2015-10-29 4 views
1

У меня есть несколько методов в моем REST api, которые возвращают пустоту. По умолчанию джерси устанавливает 204 для таких ответов. Я знаю, что если я верну какой-либо ответ на нулевой объект - 200, однако я бы хотел установить код состояния 200 без необходимости изменения этих методов. Как я могу это достичь?return OK (200) вместо NO_CONTENT (204)

+0

Зачем вам это нужно? 204 является правильным. Если вы используете 200, вы отправляете заголовок Content-Length: 0' и, возможно, заставляете клиента проверять заголовок и (несуществующий) контент. – vtortola

+0

хорошо, мне предъявили такие требования. –

ответ

2

Если вы не возражаете, перекрывая каждый 204 ответ на 200, то вы можете использовать фильтр:

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

Если вы предпочитаете более настраиваемое решение, то вы можете активируйте фильтр с аннотацией и DynamicFeature.

Аннотация:

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; 
} 

Фильтр:

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())); 
     } 
    } 
} 

И, наконец, аннотировать метод ресурса с @ResponseStatus(200):

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

Я надеялся на какую-то аннотацию, но фильтр тоже понравился. –

+0

Нет шансов. Ответ на 'void' жестко запрограммирован здесь: https://github.com/jersey/jersey/blob/master/core-server/src/main/java/org/glassfish/jersey/server/model/internal/VoidVoidDispatcherProvider. java # L82 –

+0

О, подождите! Можно активировать фильтр с помощью специальной аннотации. Дайте мне несколько минут, чтобы обновить мой ответ. –

Смежные вопросы