Обновление для Android Studio версии 1.5 или выше Как @LouMorda упомянула в комментарии ниже, что вкладка Emulator
, упомянутая в оригинальной записи, была удалена в Android Studio v 1.5.
Теперь они установили эти параметры в настройках симулятора в AVD Manager
. Чтобы получить доступ к этим настройкам:
Инструменты - & gt; Android - & gt; AVD Manager
Edit AVD
(значок карандаша)
возможен после нажав кнопку Показать дополнительные настройки
Вот скриншот о том, как это может выглядеть:
Оригинал сообщения Для тех, кто использует Android Studio IDE:
Run - & gt; Изменить настройки
Android Application - & gt; [Ваше приложение]
вкладку эмулятора
Network Speed
и Network Latency
для имитации различных скоростей и латентностей и т. д. В качестве альтернативы вы можете ввести различные аргументы в текстовое поле Additional command line options
, как указано в @ ответ индазарука.
Снимок экрана ниже описывает, как выглядит этот экран Run Configuration
:
[!d15]
Я знаю его немного поздно, чтобы ответить на этот вопрос, но я надеюсь, что это поможет другим, сталкивающимся с подобными проблемами!
Изменить Для тех, кто использует eclipse, см. ответ @ Abhi ниже.
Вот пример:
@GET
@Path("retrieve/{uuid}")
public Response retrieveSomething(@PathParam("uuid") String uuid) {
if(uuid == null || uuid.trim().length() == 0) {
return Response.serverError().entity("UUID cannot be blank").build();
}
Entity entity = service.getById(uuid);
if(entity == null) {
return Response.status(Response.Status.NOT_FOUND).entity("Entity not found for UUID: " + uuid).build();
}
String json = //convert entity to json
return Response.ok(json, MediaType.APPLICATION_JSON).build();
}
Взгляните на класс Response .
Обратите внимание, что вы всегда должны указывать тип контента, особенно если вы передаете несколько типов содержимого, но если каждое сообщение будет представлено как JSON, вы можете просто аннотировать метод с помощью @Produces("application/json")
Пожалуйста, посмотрите здесь пример, это лучше всего иллюстрирует проблему и как она решена в последней версии (2.3.1) Джерси.
https://jersey.java.net/documentation/latest/representations.html#d0e3586
В основном это связано с определением пользовательского исключения и сохранением возвращаемый тип как объект. При возникновении ошибки генерируется исключение, в противном случае вы возвращаете POJO.
Response
. Просто найдите класс CustomNotFoundException
и, возможно, скопируйте его на свой пост.
– JBert
3 March 2014 в 18:32
Если ваш WS-RS нуждается в повышении ошибки, почему бы просто не использовать исключение WebApplicationException?
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Path("{id}")
public MyEntity getFoo(@PathParam("id") long id, @QueryParam("lang")long idLanguage) {
if (idLanguage== 0){
// No URL parameter idLanguage was sent
ResponseBuilder builder = Response.status(Response.Status.BAD_REQUEST);
builder.entity("Missing idLanguage parameter on request");
Response response = builder.build();
throw new WebApplicationException(response);
}
... //other stuff to return my entity
return myEntity;
}
Мне было очень полезно создать также json-сообщение с повторным кодом, например:
@POST
@Consumes("application/json")
@Produces("application/json")
public Response authUser(JsonObject authData) {
String email = authData.getString("email");
String password = authData.getString("password");
JSONObject json = new JSONObject();
if (email.equalsIgnoreCase(user.getEmail()) && password.equalsIgnoreCase(user.getPassword())) {
json.put("status", "success");
json.put("code", Response.Status.OK.getStatusCode());
json.put("message", "User " + authData.getString("email") + " authenticated.");
return Response.ok(json.toString()).build();
} else {
json.put("status", "error");
json.put("code", Response.Status.NOT_FOUND.getStatusCode());
json.put("message", "User " + authData.getString("email") + " not found.");
return Response.status(Response.Status.NOT_FOUND).entity(json.toString()).build();
}
}
Я использую jersey 2.0 с читателями и авторами сообщений. У меня был тип возвращаемого метода как конкретный объект, который также использовался в реализации автора сообщения сообщения, и я возвращал то же самое pojo, SkuListDTO. @GET @Consumes ({"application / xml", "application / json"}) @Produces ({"application / xml", "application / json"}) @Path ("/ skuResync")
public SkuResultListDTO getSkuData()
....
return SkuResultListDTO;
все, что я изменил, это то, что я оставил выполнение записи самостоятельно, и он все еще работал.
public Response getSkuData()
...
return Response.status(Response.Status.FORBIDDEN).entity(dfCoreResultListDTO).build();
Я не использую JAX-RS, но у меня есть аналогичный сценарий, в котором я использую:
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
Если вы хотите изменить код состояния из-за исключения, с JAX-RS 2.0 вы можете реализовать ExceptionMapper, как это. Это обрабатывает такое исключение для всего приложения.
@Provider
public class UnauthorizedExceptionMapper implements ExceptionMapper<EJBAccessException> {
@Override
public Response toResponse(EJBAccessException exception) {
return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
}
}
Ответ от hedrewness будет работать, но он изменяет весь подход к тому, чтобы провайдер, такой как Jackson + JAXB, автоматически конвертировал возвращаемый объект в какой-то выходной формат, такой как JSON. Вдохновленный Apache CXF post (который использует класс, специфичный для CXF), я нашел один способ установить код ответа, который должен работать в любой реализации JAX-RS: ввести контекст HttpServletResponse и вручную установить код ответа. Например, вот как установить код ответа на CREATED
, когда это необходимо.
@Path("/foos/{fooId}")
@PUT
@Consumes("application/json")
@Produces("application/json")
public Foo setFoo(@PathParam("fooID") final String fooID, final Foo foo, @Context final HttpServletResponse response)
{
//TODO store foo in persistent storage
if(itemDidNotExistBefore) //return 201 only if new object; TODO app-specific logic
{
response.setStatus(Response.Status.CREATED.getStatusCode());
}
return foo; //TODO get latest foo from storage if needed
}
Улучшение: После поиска другого связанного ответа Я узнал, что в качестве переменной-члена можно ввести HttpServletResponse
, даже для класса обслуживания Singleton (по крайней мере, в RESTEasy)! Это гораздо лучший подход, чем загрязнение API с помощью деталей реализации. Это будет выглядеть так:
@Context //injected response proxy supporting multiple threads
private HttpServletResponse response;
@Path("/foos/{fooId}")
@PUT
@Consumes("application/json")
@Produces("application/json")
public Foo setFoo(@PathParam("fooID") final String fooID, final Foo foo)
{
//TODO store foo in persistent storage
if(itemDidNotExistBefore) //return 201 only if new object; TODO app-specific logic
{
response.setStatus(Response.Status.CREATED.getStatusCode());
}
return foo; //TODO get latest foo from storage if needed
}
@Produces
и не указывать тип носителя в конечной Response.ok
, и вы правильно получите возвращаемый объект JAXB-сериализован в соответствующий тип носителя, чтобы он соответствовал запрос. (Я просто попробовал это с помощью одного метода, который мог бы вернуть либо XML, либо JSON: сам метод не нужно упоминать, кроме как в аннотации @Produces
.)
– Royston Shufflebotham
26 September 2012 в 22:31
MessageBodyWriter
и Provider
допускает неявное согласование содержимого, хотя, похоже, ваш пример не содержит кода. Ниже приведен еще один ответ, который иллюстрирует это: stackoverflow.com/questions/5161466/…
– hisdrewness
4 December 2012 в 22:38
response.setStatus()
. Единственный способ отправить, например, ответ 404 Not Found , - это установить код состояния ответа response.setStatus(404)
en, а затем закрыть выходной поток response.getOutputStream().close()
, чтобы JAX-RS не смог сбросить мой статус.
– Rob Juurlink
18 October 2013 в 09:45
response.flushBuffer()
, чтобы избежать переопределения кода ответа. Не очень чистый.
– Pierre Henry
3 April 2014 в 16:40
404 Not Found
, может быть проще просто использовать throw new NotFoundException()
.
– Garret Wilson
22 August 2014 в 01:25
JAX-RS поддерживает стандартные / пользовательские HTTP-коды. См. ResponseBuilder и ResponseStatus, например:
Имейте в виду, что информация JSON больше связана с данными, связанными с ресурсом / приложением. Коды HTTP больше относятся к статусу запрашиваемой операции CRUD. (по крайней мере, так оно и должно быть в системах REST-ful)
Также обратите внимание, что по умолчанию Джерси переопределит тело ответа в случае http-кода 400 или более.
Чтобы получить указанный объект в качестве тела ответа, попробуйте добавить следующий init -param к вашему Джерси в вашем файле конфигурации web.xml:
<init-param>
<!-- used to overwrite default 4xx state pages -->
<param-name>jersey.config.server.response.setStatusOverSendError</param-name>
<param-value>true</param-value>
</init-param>
Если вы хотите, чтобы ваш уровень ресурсов был очищен от объектов Response
, я рекомендую вам использовать @NameBinding
и привязку к реализациям ContainerResponseFilter
.
Вот мясо аннотации:
package my.webservice.annotations.status;
import javax.ws.rs.NameBinding;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface Status {
int CREATED = 201;
int value();
}
Вот мясо фильтра:
package my.webservice.interceptors.status;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
@Provider
public class StatusFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException {
if (containerResponseContext.getStatus() == 200) {
for (Annotation annotation : containerResponseContext.getEntityAnnotations()) {
if(annotation instanceof Status){
containerResponseContext.setStatus(((Status) annotation).value());
break;
}
}
}
}
}
И тогда реализация на вашем ресурсе просто станет:
package my.webservice.resources;
import my.webservice.annotations.status.StatusCreated;
import javax.ws.rs.*;
@Path("/my-resource-path")
public class MyResource{
@POST
@Status(Status.CREATED)
public boolean create(){
return true;
}
}
return Response.status(Response.Status.Forbidden).entity(myPOJO).build();
Работает так, как если бы выreturn myPOJO;
, но с дополнительной настройкой кода HTTP-состояния. – kratenko 25 February 2015 в 16:54