Вторая попытка ответить на этот вопрос после того, как был изменен вопрос.
Вы можете создать свой JSON-компонент и игнорировать неизвестные значения, такие как ID с аннотацией Джексона «JsonIgnoreProperties».
Вы следующий ресурс:
@Post
public Response hello(Person person) {
return Response
.status(Status.OK)
.entity(String.format("Hello %s. We know that you are %s years old, but we do not know if you send more informations to us like id or sth. else.", person.getName(), person.getAge()))
.build();
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class Person {
private final String name;
private final int age;
@JsonCreator
public Person(@JsonProperty String name,@JsonProperty int age) {
this.name= name;
this.age= age;
}
@JsonProperty
public String getName() {
return name;
}
@JsonProperty
public String getage() {
return age;
}
}
Старый Ответ:
Почему бы не проверять их? Ниже приведен пример того, как это сделать.
Вариант 1:
@Path("smooth")
@GET
public Response smooth(
@DefaultValue("2") @QueryParam("step") int step,
@DefaultValue("true") @QueryParam("min-m") boolean hasMin,
@DefaultValue("true") @QueryParam("max-m") boolean hasMax,
@DefaultValue("true") @QueryParam("last-m") boolean hasLast,
@DefaultValue("blue") @QueryParam("min-color") ColorParam minColor,
@DefaultValue("green") @QueryParam("max-color") ColorParam maxColor,
@DefaultValue("red") @QueryParam("last-color") ColorParam lastColor) {
validateMaxColor(maxColor);
}
public void validateMaxColor(ColorParam maxColorParam){
if(!maxColorParam.isInRange()){
throw new WebapplicationException("maxColorParam out of range");
}
}
Вариант 2: Используйте определенный класс парам
@Path("smooth")
@GET
public Response smooth(
@DefaultValue("2") @QueryParam("step") int step,
@DefaultValue("true") @QueryParam("min-m") boolean hasMin,
@DefaultValue("true") @QueryParam("max-m") boolean hasMax,
@DefaultValue("true") @QueryParam("last-m") boolean hasLast,
@DefaultValue("blue") @QueryParam("min-color") ColorParam minColor,
@DefaultValue("green") @QueryParam("max-color") ColorParam maxColor,
@DefaultValue("red") @QueryParam("last-color") ColorParam lastColor) {
....
}
public class ColorParam extends Color {
public ColorParam(String color) {
super(getRGB(color));
if(getRGB(color).isGreen()){
throw new ParseException("ohh nooooo ... green is not allowed here");
}
}
private static int getRGB(String s) {
if (s.charAt(0) == '#') {
try {
Color c = Color.decode("0x" + s.substring(1));
return c.getRGB();
} catch (NumberFormatException e) {
throw new WebApplicationException(400);
}
} else {
try {
Field f = Color.class.getField(s);
return ((Color)f.get(null)).getRGB();
} catch (Exception e) {
throw new WebApplicationException(400);
}
}
}
}
Здесь важно, что вы используете конструктор String.
Вариант 3: для пользователей Dropwizard; Используйте AbstractParam и проверять входящую строку
См Dropwizard documentation about Params:
Параметры
аннотированных методов классов ресурсов могут принимать параметры, которые сопоставленные с из аспектов входящего запроса. Аннотации * Param определяют, какая часть запроса сопоставлена данными, и тип параметра определяет способ отображения данных.
Например:
A @PathParam("user")-annotated String takes the raw value from the user variable in the matched URI template and passes it into the
метод в виде строки. Параметр @QueryParam («count») - аннотированный параметр IntParam принимает первое значение счетчика из строки запроса запроса и передает его как конструктор String в конструкцию IntParam как . IntParam (и все остальные классы io.dropwizard.jersey.params. *) Анализирует строку как Целое число, возвращая 400 Bad Request, если значение искажено. A @FormParam («имя») - аннотированный параметр Set принимает все значения имен из опубликованной формы и передает их методу в виде набора строк . A * Параметр-аннотированный NonEmptyStringParam будет интерпретировать пустые строки как отсутствующие строки, что полезно в случаях, когда конечная точка обрабатывает пустые строки и отсутствующие строки как взаимозаменяемые.
Что примечательно, так это то, что вы можете фактически инкапсулировать большую часть вашей логики проверки с помощью специализированных объектов параметров. См. AbstractParam для деталей.
Ваш ресурс должен получить что-то вроде этого:
@Path("long")
@GET
public Response long(
@QueryParam("long") LongParam longValue) {
//here your longValue is in wanted Range
//doubles or floats will return a HTTP 400
}
/**
* A parameter encapsulating long values. All non-decimal values will return a {@code 400 Bad
* Request} response.
*/
public class LongParam extends AbstractParam<Long> {
public LongParam(String input) {
super(input);
}
@Override
protected String errorMessage(Exception e) {
return "Parameter is not a number.";
}
@Override
protected Long parse(String input) {
return Long.valueOf(input);
}
}
С этим вы можете легко проверить свою входящую строку и сгенерирует исключение, если строка не может быть разобрана или не допустимый диапазон (например, если вы хотите HexValue и ваша строка # ZZ8000, тогда вы можете проверить, что в шестнадцатеричной строке не разрешено содержать никаких «Z»).
Hi hiaclibe. Я столкнулся с проблемой написания проверки достоверности включений. Я должен проверить параметр в запросе, чтобы содержать только значение из списка. Например: «степень» - это параметр запроса, который может содержать только значения в [B.E, BSC, UG, PG и т. Д.] – Vicky
@Vicky: Задайте новый вопрос. Ваши новые требования неясны и являются надмножеством тех, которые вы изначально указали в своем вопросе. – Matt