繁体   English   中英

相当于泽西的Spring MVC @ResponseStatus(HttpStatus.CREATED)?

[英]Equivalent of Spring MVC @ResponseStatus(HttpStatus.CREATED) in Jersey?

这个Spring MVC代码的Jersey相当于什么? 在成功发布POST之后,我需要响应以返回201以及资源URL:

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

我不认为泽西岛有这样的注释。 您可以使用名称绑定创建一个。

基本上,您创建一个注释并添加@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)@ResponseStatus(Status.CREATED)并使用responseContext.getAnnotations()获取过滤器中的状态来使其更通用。

根据OP的要求发表评论的例子:

我不认为有同等的,但就个人而言,我喜欢创建自己的回复。 我有更多的控制权。 还有一个Response.created(...) ,这将自动设置状态。 它接受URI或String作为参数,并使用该参数设置位置标头。 你也可以使用UriInfo来获取getAbsolutePathBuilder()然后只需附加创建的id。 这通常就是我的方式。

@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)获得的绝对路径,然后您只需将创建的id附加到路径。 因此,如果收集路径是http://blah.com/widgets ,并且id是someId ,那么位置标题将是Location: http://blah.com/widgets/someId someId (这是新资源的位置) ),状态将设置为201 Created

Response.created(..)返回Response.ResponseBuilder ,就像Response.status一样,所以你可以做通常的方法链接。 Response上有许多静态方法都有默认设置,比如oknoContent 只需通过API。 他们的名字几乎与状态名称相匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM