Resful APi ouput is changing from JSON to XML when we send BAD Request status as output

222 Views Asked by At

I made a restful API which produces JSON format output (@Produces(MediaType.APPLICATION_JSON)). This is working as expected when the status is Created or Ok. But whenever I send output bad request with some error message in JSON format. I'm not receiving the expected JSON result with error message instead of that I'm receiving something like "Unexpected 'B'" when i use postman for testing. If I use soapui for testing it is giving result in Xml.

These are the annotations I have used for my method

@POST 
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("sample")

These are responses im sending based on request

return Response
            .status(Status.BAD_REQUEST)
            .type(MediaType.APPLICATION_JSON)
            .header("Access-Control-Allow-Origin", "*")
            .header("Access-Control-Allow-Methods", " POST")
            .entity(JsonResponse)
            .build();

return Response
            .status(Status.UNAUTHORIZED)
            .type(MediaType.APPLICATION_JSON)
            .header("Access-Control-Allow-Origin", "*")
            .header("Access-Control-Allow-Methods", " POST")
            .entity(JsonResponse)
            .build();

 return Response
        .status(Status.CREATED)
        .type(MediaType.APPLICATION_JSON)
        .header("Access-Control-Allow-Origin", "*")
        .header("Access-Control-Allow-Methods", "POST")
        .entity(JsonResponse)
        .build();

I have problem only when the return type is Other than Status created.

This is my object mapper class

private static final ObjectMapper MAPPER = new ObjectMapper();
static 
{
  MAPPER.setSerializationInclusion(Include.ALWAYS);
  MAPPER.disable(MapperFeature.USE_GETTERS_AS_SETTERS);
  MAPPER.configure(SerializationFeature.WRAP_ROOT_VALUE, true); //in response
  MAPPER.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);//in   request


}
public ObjectMapperProvider()
{
System.out.println("Instantiate ObjectMapperProvider");
}

@Override
public ObjectMapper getContext(Class<?> arg0) 
{
return MAPPER;
}

I have used following response type in postman

This is the result I got for above request. Im expecting a json format output

This result im seeing in soapUi in XML format

This result im seeing in SoapUi in json format

This is the response Im seeing when I sent 401 status code with error message in XML Format but im sending in JSON format.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
    <title>401 - Unauthorized: Access is denied due to invalid credentials. 
    </title>
    <style type="text/css">
        <!--
     body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica,                            
     sans-serif;background:#EEEEEE;}
      fieldset{padding:0 15px 10px 15px;} 
      h1{font-size:2.4em;margin:0;color:#FFF;}
      h2{font-size:1.7em;margin:0;color:#CC0000;} 
      h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} 
      #header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font- 
      family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
      background-color:#555555;}
      #content{margin:0 0 0 2%;position:relative;}
      .content-container{background:#FFF;width:96%;margin- 
       top:8px;padding:10px;position:relative;}
       -->

        </style>
       </head>
         <body>
           <div id="header">
             <h1>Server Error</h1>
           </div>
           <div id="content">
              <div class="content-container">
                 <fieldset>
                    <h2>401 - Unauthorized: Access is denied due to invalid 
                credentials.</h2>
                     <h3>You do not have permission to view this directory or page using the credentials that you supplied.</h3>
                 </fieldset>
             </div>
          </div>
          </body>
        </html>

If you need any other information let me know.

0

There are 0 best solutions below