2016-11-21 3 views
1

Я внедрил веб-сервис RESTful на основе Джерси. При отправке моего запроса сначала проверяю, определены ли какие-то обязательные параметры, а если нет, я возвращаю ответ с кодом ошибки и сообщением об ошибке. Вот фрагмент кода:Не могу получить JSON с http-запроса

@Path("/groups") 
@RequestScoped 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(value = {MediaType.APPLICATION_JSON, MediaType.TEXT_XML}) 
public class GroupResource 
{ 
    ... 
    @POST 
    public Response createGroup(Group group, @Context UriInfo uriInfo) 
    { 
    logger.info("-------------------"); 
    logger.info("Create group"); 
    logger.fine(group.toString()); 
    logger.info("-------------------"); 

    // check mandatory fields 
    if (!checkMandatoryFields(group, errorMessages)) 
    { 
     return Response.status(Status.BAD_REQUEST).entity(errorMessages).build(); 
    } 
    ... 
} 

Затем я реализовал тест JUnit, чтобы проверить:

@Test 
    public void testCreateGroup() 
    { 
    try 
    { 
     URL url = new URL(URL_GROUPS_WS); 

     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoOutput(true); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Content-Type", "application/json"); 

     String json2send = "{\"grid\":\"1\", \"gidNumber\":\"2\", \"groupName\":\"TestGroup\", \"groupDescription\":\"Initial description\", \"targetSystems\":[\"ADD TS1\"]}"; 

     OutputStream os = conn.getOutputStream(); 
     os.write(json2send.getBytes()); 
     os.flush(); 

     System.out.println("XXXXXXXX Sending request XXXXXXXX \n"); 

     if (conn.getResponseCode() != 200) 
     { 
     BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

     StringBuffer error = new StringBuffer(); 
     String inputLine; 
     while ((inputLine = in.readLine()) != null) 
     { 
      error.append(inputLine); 
     } 

     in.close(); 

     throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode() + error.toString()); 
     } 
    ... 
} 

Моя проблема заключается в том, что я получаю responseCode, но я не знаю, как получить ошибку сообщение, которое должно быть где-то в ответе, не так ли? (Response.status(Status.BAD_REQUEST).entity(**errorMessages**).build()).

выше кода, где я могу проверить код ответа, не работает ...

Не могли бы вы мне помочь?

+0

Определение "не работает" точно. Чего вы ожидаете, палочка, что происходит вместо этого? –

ответ

0

Вместо InputStream, используйте ErrorStream -

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getErrorStream())); 

ErrorStream даст вам ответ в случае ошибки.

0

Это не то, как проверить джерси компонент надлежащим образом, на самом деле вы должны полагаться на Jersey Test Framework протестировать компонент, как он скрывает много сложностей, таких, что ваш блок тест легко читать и поддерживать.

Ваш текущий код слишком подвержен ошибкам и его следует избегать.

Предполагая, что вы используете maven, вам необходимо добавить следующие 2 зависимости к вашему проекту с областью test.

<dependency> 
    <groupId>org.glassfish.jersey.test-framework</groupId> 
    <artifactId>jersey-test-framework-core</artifactId> 
    <version>2.24</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jersey.test-framework.providers</groupId> 
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId> 
    <version>2.24</version> 
    <scope>test</scope> 
</dependency> 

Тогда вы можете просто сделать свой блок тест расширяет JerseyTest и переопределить метод configure, чтобы обеспечить класс вашего отдыха компонента, и это делается для установки в средах. Он автоматически запустит сечение гризли и свяжет ваш компонент для вас, так что осталось только написать ваш блок (ы).

Ваш тестовый класс может быть что-то вроде этого:

public class GroupResourceTest extends JerseyTest { 

    @Override 
    protected Application configure() { 
     return new ResourceConfig(GroupResource.class); 
    } 

    @Test 
    public void testCreateGroup() { 
     Group group = // create your group instance to test here 
     Response response = target("/groups") 
      .request() 
      .accept(MediaType.APPLICATION_JSON) 
      .post(Entity.entity(group, MediaType.APPLICATION_JSON)); 
     Assert.assertEquals(Response.Status.BAD_REQUEST, response.getStatus()); 
     Assert.assertEquals("My error message", response.readEntity(String.class)); 
    } 
} 
Смежные вопросы