Java 为什么我在我的Jersey REST API上的帖子会得到500的回复?

Java 为什么我在我的Jersey REST API上的帖子会得到500的回复?,java,jersey,dropwizard,postman,Java,Jersey,Dropwizard,Postman,我刚刚开始实施我的第一个Drowizard项目。这是我的第一个资源类: @Path("/bill") public class CommandResource { //... @POST @Consumes(MediaType.APPLICATION_JSON) @Path("/createBillForStudy") public Response handleCreateBillForStudyCommand(CreateBillForStudyCo

我刚刚开始实施我的第一个Drowizard项目。这是我的第一个资源类:

@Path("/bill")
public class CommandResource {
    //...

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Path("/createBillForStudy")
    public Response handleCreateBillForStudyCommand(CreateBillForStudyCommand cmd, @Context UriInfo uriInfo)
    {
        System.out.println("Creating bill for command: " + cmd);

        UUID newId = billCreator.handle(cmd);

        URI location = uriInfo.getBaseUriBuilder().path(CommandResource.class).path("/" + newId).build();

        return Response.accepted(cmd).contentLocation(location).build();
    }
}
我想用Postman测试一下,但是下面的请求导致500个响应,我不知道为什么:

POST /bill/createBillForStudy HTTP/1.1
Host: localhost:8080
Content-Type: application/JSON
Cache-Control: no-cache

{ "idAccount": "123", "idStudy": "456", "timeStamp": "2014-01-01" }
这是我在Dropwizard控制台中看到的内容:

ERROR [2015-05-07 16:43:08,558] org.glassfish.jersey.message.internal.WriterInterceptorExecutor: MessageBodyWriter not found for media type=application/xml, type=class com.statista.billing.domain.commands.CreateBillForStudyCommand, genericType=class com.statista.billing.domain.commands.CreateBillForStudyCommand.
0:0:0:0:0:0:0:1 - - [07/Mai/2015:16:43:08 +0000] "POST /bill/createBillForStudy/ HTTP/1.1" 500 332 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36" 8
对我来说,这听起来好像内容类型头是wring或missing,但正如您在上面看到的,它被正确地设置为“application/JSON”

有什么想法吗?

。这将向客户端返回表示。为了确定响应的
内容类型
,我们需要指定它,它应该由
Accept
请求头指定

如果要返回表示,应始终确保使用
@products
注释指定支持的格式。如果您希望返回JSON(与接受JSON的方式相同,那么只需使用

@Produces(MediaType.APPLICATION_JSON)
当前的问题是,响应正试图按照错误指定的方式封送到XML

MessageBodyWriter not found for media type=application/xml, 
          type=class com.s.b.d.c.CreateBillForStudyCommand
它默认为XMl,因为您没有在
@products
或客户端设置no
Accept
头中指定。如果有
Accept:application/json
,那么如果没有
@products
,它将寻找
MessageBodyWriter
来处理json

作为旁白。。。
接受
()表示

请求已被接受处理,但处理尚未完成

您应该改为使用(201):

请求已完成,并导致创建了新资源。新创建的资源可由响应实体中返回的URI引用,最特定的URI由位置标头字段给出

使用创建的
,无需显式调用
位置
,传递给方法的
URI
将设置为
位置
头。如果要添加正文,可以


编辑:
另外,如果您不想在响应中发送表示,可以简单地调用no arg方法。这将不会发送响应正文,也不会再出现异常。

使用accepted是一个有意识的决定。我无法返回已创建资源的表示,因为创建将是异步的。(尚未实施,但我知道我必须这样做。)那么我应该返回命令的JSON表示吗?对我来说似乎是多余的,但这当然不会是一个问题。有一个不带任何参数的方法。我还要说,在大多数情况下它是多余的。酷。无参数方法应该是我所需要的。我一回到工作岗位就会尝试。你想编辑你的答案以便我接受吗那么?