如果我发送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的编组行为?
答案 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();
}
}
希望这在某种程度上有所帮助:)