2015-02-20 2 views
4

Что такое эквивалент Джерси этого весеннего кода MVC? Мне нужен ответ, чтобы вернуть 201 вместе с URL ресурса, после успешного POST:Эквивалент Spring MVC @ResponseStatus (HttpStatus.CREATED) в Джерси?

@RequestMapping(method = RequestMethod.POST) 
@ResponseStatus(HttpStatus.CREATED) 
Widget create(@RequestBody @Valid Widget wid) { 
    return service.create(wid); 
} 

Это самый короткий пример, который я нашел в Джерси. Требуется ли создать ответ вручную для успешного POST/201?

@POST @Path("widget") 
Response create(@RequestBody @Valid Widget wid) { 
    return Response 
      .status(Response.Status.CREATED) 
      .entity("new widget created") 
      .header("Location","http://localhost:7001/widget"+wid) 
      .build(); 
    } 
+2

Я не думаю, что есть эквивалент, но лично мне нравится создавать свой собственный ответ. У меня больше контроля. Также есть 'Response.created (...)', а затем автоматически устанавливает статус. Он принимает URI или String в качестве заголовка местоположения. Также вы можете использовать 'UriInfo' для' getAbsolutePathBuilder() ', а затем просто добавить созданный идентификатор. Это вообще так, как я об этом думаю –

+0

звучит интересно, можете ли вы разместить пример? – raffian

ответ

2

Пример комментария, по просьбе OP:

Я не думаю, что есть эквивалент, но лично мне нравится, создавая свой собственный ответ. У меня больше контроля. Также есть Response.created(...), это автоматически установит статус. Он принимает URI или String в качестве аргумента и устанавливает заголовок местоположения с этим аргументом. Также вы можете использовать UriInfo до getAbsolutePathBuilder(), а затем просто добавить созданный идентификатор. Обычно я об этом говорю.

@Path("/widgets") 
public class WidgetResource { 

    @Inject 
    WidgetService widgetService; 

    @POST 
    @Consumes(...) 
    public Response createWidget(@Context UriInfo uriInfo, Widget widget) { 
     Widget created = widgetService.createWidget(widget); 

     UriBuilder builder = uriInfo.getAbsolutePathBuilder(); 
     URI uri = builder.path(created.getId()).build(); 

     return Response.created(uri).build(); 
    } 
} 

Это общая схема я использую для моего создания методов. Путь коллекции будет абсолютным путем, полученным от uriInfo.getAbsolutePath(Builder), а затем просто добавьте созданный идентификатор к пути. Таким образом, если путь коллекции http://blah.com/widgets, и идентификатор someId, то заголовок местоположение будет Location: http://blah.com/widgets/someId (который является расположение нового ресурса), и статус будет приготовьтесь к 201 Created

Response.created(..) возвращает Response.ResponseBuilder, так же, как Response.status, поэтому вы можете сделать обычную цепочку методов. Существует ряд статических методов на Response, которые имеют настройки по умолчанию, например ok, noContent. Просто выполните через API. Их имена в значительной степени совпадают с именем статуса.

2

Я не думаю, что в Джерси есть аннотация. Вы можете создать его с помощью Name Binding.

В принципе, вы создаете аннотацию и добавьте @NameBinding мета-аннотаций:

@NameBinding 
@Target({ElementType.TYPE, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ResponseStatusCreated {} 

Далее создать фильтр, который перекроет статус.

@ResponseStatusCreated 
@Provider 
class StatusCreatedFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext, 
         ContainerResponseContext responseContext) throws IOException { 
     responseContext.setStatusInfo(Response.Status.CREATED) 

     String location = "..."; // set based on responseContext.getEntity() 
           // or any other properties 
     responseContext.getHeaders().putSingle("Location", location); 
    } 
} 

Затем используйте те же аннотации для своих методов ресурсов.

@POST 
@Path("widget") 
@ResponseStatusCreated 
Object create(@RequestBody @Valid Widget wid) { 
    return ... // return whatever you need to build the 
       // correct header fields in the filter 
} 

Вы также могли бы сделать его более универсальным путем создания аннотаций, который будет принимать статус в качестве аргумента, т.е. @ResponseStatus(Status.CREATED) и получить статус в фильтре с использованием responseContext.getAnnotations().

+0

kudos для '@ NameBinding', чему-то научился, пытаясь решить, с каким ответом идти, этот вариант - более эффективная работа, но, конечно, более элегантная в использовании. – raffian

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