在Jersey中处理Null XML有效负载

时间:2014-09-11 18:21:05

标签: java xml json jaxb jersey

如果我发送Null xml有效负载,它会在命中Controller方法之前抛出异常。

javax.xml.bind.UnmarshalException
 - with linked exception:
[org.xml.sax.SAXParseException: Premature end of file.]

但是当我发送JSON有效负载时。 Jackson api向控制器方法发送Null Entity对象。

@POST
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response createEntity(Entity entity) {}

如何使用XML Payloads实现Jackson的编组行为?

1 个答案:

答案 0 :(得分:1)

编组员的反应是正确的。例如,User类的最小预期xml可以是:

<?xml version="1.0" encoding="UTF-8"?>
<user></user>

实际上是一个空用户。如果你现在发送:

<?xml version="1.0" encoding="UTF-8"?>

marshaller没有起始值,有效负载被标记为已损坏。类似的情况下不发送任何内容。

但是如果你使用球衣2.? (对我来说是2.12)你可以使用ExceptionMapper对此作出反应(样本)。

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.BadRequestException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.NoContentException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.UnmarshalException;

@Provider
public class BadRequestExceptionMapper implements ExceptionMapper<BadRequestException>{

    @Context
    private HttpServletRequest cr;

    @Override
    public Response toResponse(BadRequestException e) {

        String reason = String.format("Reason: %s", e.toString());

        if( e.getCause() instanceof UnmarshalException )
            reason = "Request payload is invalid.";

        if( e.getCause() instanceof NoContentException )
            reason = "No payload given.";

        return Response.status(Status.BAD_REQUEST)
            .entity(String.format("%s [resource:%s, contentType:%s, method:%s]", reason, cr.getPathInfo(), cr.getContentType(), cr.getMethod() ) ).build();
    }

}

希望这在某种程度上有所帮助:)