Джексон проверить необязательное поле - PullRequest
0 голосов
/ 28 сентября 2018

Вопрос

Я делаю POJO (Person) в проекте JAX-RS и использую Jackson.
Я хочу создать необязательное поле String (например, страну, где человек живет) ибыть в состоянии проверить его длину.

Мои тесты

По ссылке на этот пост ( Как определить необязательное поле json с помощью Jackson ) Я знаю, как сделать необязательное поле,Но если я хочу проверить его длину с помощью javax.validation.constraints.Pattern, например:

@Pattern(regexp = "(?:.{0,12})?")
private final String country;

страна не может быть NULL или больше не присутствовать.

Я пытался добавить @ Необязательно (org.jvnet.hk2.annotations.Optional) и указать страну как private final Optional<String> country;.Я не добился успеха с этими двумя методами.

Мой фактический POJO

import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import org.hibernate.validator.constraints.NotBlank;

import javax.validation.constraints.Pattern;

@JsonAutoDetect(creatorVisibility = Visibility.ANY, fieldVisibility = Visibility.ANY)
@JsonPropertyOrder({Person.LAST_NAME, Person.FIRST_NAME, Person.COUNTRY})
@JsonIgnoreProperties(ignoreUnknown = true)
public class Person {

    /**
     * The format string for the toString method
     */
    private static final String TO_STRING_FORMAT = "%S %s %s";

    /**
     * JSON property name for the last name
     */
    static final String LAST_NAME = "lastName";

    /**
     * JSON property name for the first name
     */
    static final String FIRST_NAME = "firstName";

    /**
     * JSON property name for the country
     */
    static final String COUNTRY = "country";

    /**
     * The last name of the person
     */
    @NotBlank
    private final String lastName;

    /**
     * The first name of the person
     */
    @NotBlank
    private final String firstName;

    /**
     * The country of the person
     */
    @Pattern(regexp = "(?:.{0,12})?")
    private final String country;

    /**
     * Returns an new {@code Person} with its properties initialized from parameters.
     *
     * @param lastName the last name of the person ({@link #lastName})
     * @param firstName the first name of the person ({@link #firstName})
     * @param country the country where the person live ({@link #country})
     */
    // Only used by Jackson for the JSON data deserialization
    @SuppressWarnings("unused")
    @JsonCreator
    private Person(@JsonProperty(Person.LAST_NAME) String lastName, @JsonProperty(Person.FIRST_NAME) String firstName, @JsonProperty(Person.COUNTRY) String country) {
        this.lastName = lastName.trim();
        this.firstName = firstName.trim();
        this.country = country.trim();
    }

    /**
     * Returns a new {@code Person} with its properties initialized from another one.
     *
     * @param person the instance used to create the new one
     */
    Person(Person person) {
        this.lastName = person.lastName;
        this.firstName = person.firstName;
        this.country = person.country;
    }

    /**
     * Returns a textual representation of the {@code Person}: {@link #lastName} {@link #firstName} {@link #country}.
     * <p>
     * The {@code lastName} is converted to uppercase for better readability of the person's name.
     *
     * @return a string representation of the {@code Person}
     */
    @Override
    public String toString() {
        return String.format(Person.TO_STRING_FORMAT, this.lastName, this.firstName, this.country);
    }
}

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Проблема

Проблема заключалась в том, что я сделал trim() для страны (возможно, значение NULL).См. Ниже:

@SuppressWarnings("unused")
@JsonCreator
private Person(@JsonProperty(Person.LAST_NAME) String lastName, @JsonProperty(Person.FIRST_NAME) String firstName, @JsonProperty(Person.COUNTRY) String country) {
    this.lastName = lastName.trim();
    this.firstName = firstName.trim();
    this.country = country.trim();
}

Решение

Я хочу поблагодарить @TheOddCoder за его решение.Мое @Pattern регулярное выражение не изменяется, но конструктор private Person(...) (@ JsonCreator) изменяется следующим образом:

@SuppressWarnings("unused")
@JsonCreator
private Person(@JsonProperty(Person.LAST_NAME) String lastName, @JsonProperty(Person.FIRST_NAME) String firstName, @JsonProperty(Person.COUNTRY) String country) {
    this.lastName = lastName.trim();
    this.firstName = firstName.trim();
    if(country == null) {
        this.country = country;
    } else {
        this.country = country.trim();
    }
}
0 голосов
/ 28 сентября 2018

В вашем случае я бы, возможно, предложил бы вместо использования необязательного для вашего поля, вы проверяете свою страну, если она установлена ​​или нет, и обрабатываете ее таким образом.

private Person(@JsonProperty(Person.LAST_NAME) String lastName, @JsonProperty(Person.FIRST_NAME) String firstName, @JsonProperty(Person.COUNTRY) String country) {
    this.lastName = lastName.trim();
    this.firstName = firstName.trim();
    if(country == null) { //here you could also use the string empty or null check of apache or guava
        this.country = country;
    } else {
        this.country = country.trim();
    }
}

При этом вам не нужно заботиться о том, установлен он или нет, и регулярное выражение будет совпадать, несмотря ни на что.

Надеюсь, это поможет.

...