Использование Json в JAX-RS: запрещение нулевых значений - PullRequest
0 голосов
/ 21 января 2020

Я пишу простой сервис REST, который ожидает POST, содержащий Json. Служба должна отказаться от любого Json, не содержащего именно те ключи, которые оно ожидает. Я использую JAX-RS на JBoss EAP 7.1 и не смог этого сделать. Пример кода:

import javax.ejb.Stateless;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/")
@Stateless
@Produces("text/plain")
public class TestAccess
{
  @POST
  @Path("test/")
  @Consumes(MediaType.APPLICATION_JSON)
  public String consumeJson(TestClass c)
  {
    return c.toString();
  }

}
public class TestClass
{
  public String first;
  public String second;

  public String toString()
  {
    return (first + ", " + second);
  }
}

Ранее я написал consumeJson, ожидая ожидаемого JsonObject и проанализировал это с использованием Jackson ObjectMapper. Это привело к ошибке при получении Json недостающих ключей. Я думаю, что способ, которым я делаю это сейчас, является "более чистым" способом сделать это, поскольку теперь список параметров ясно показывает, какой объект должен описывать Json. Однако я не хочу проверять каждое отдельное поле первым в методе, и при этом я не хочу добавлять метод isValid() к каждому объекту, который я получаю таким образом.

Пример {"first" : "contentOfFirst"} возвращает "contentOfFirst, null" вместо сбоя.

РЕДАКТИРОВАТЬ: Чтобы уточнить, я попытался что-то вроде этого:

import javax.validation.constraints.NotNull;

public class TestClass
{
  @NotNull
  public String first;
  @NotNull
  public String second;

  public String toString()
  {
    return (first + ", " + second);
  }
}

Это не изменило результат, вместо того, чтобы проваливать (как это предполагалось) POST все еще получил ответ "contentOfFirst, null". Я знаю, что эти аннотации все еще нуждаются в валидаторе для их проверки. У меня (ложно?) Сложилось впечатление, что Jboss предоставляет такой валидатор.

Ответы [ 2 ]

1 голос
/ 21 января 2020

Оказывается, я пропустил, что вам нужна еще одна аннотация для обеспечения выполнения проверок:

  @POST
  @Path("test/")
  @Consumes(MediaType.APPLICATION_JSON)
  public String consumeJson(@Valid TestClass c)
  {
    return c.toString();
  }

Это все, что нужно JBoss для фактического применения проверок.

Следует отметить, что JBoss не нравится использование классов @Valid и generi c (например, List<PathSegment>) в одном и том же списке параметров.

0 голосов
/ 21 января 2020

Современные версии Джексона имеют @JsonCreator & @JsonProperty для некоторой проверки во время десериализации, например, для вашего случая:

public class TestClass
{
    @JsonCreator
    TestClass(
            @JsonProperty(value = "first", required = true) Integer first,
            @JsonProperty(value = "second", required = true) Integer second) {
        this.first = first;
        this.second= second;
    }
    public String first;
    public String second;

    public String toString()
    {
        return (first + ", " + second);
    }
}

Более надежное решение будет использовать Проверка бобов

...