Ich habe eine Modellklasse wie diese für den Winterschlaf
@Entity
@Table(name = "user", catalog = "userdb")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User implements java.io.Serializable {
private Integer userId;
private String userName;
private String emailId;
private String encryptedPwd;
private String createdBy;
private String updatedBy;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "UserId", unique = true, nullable = false)
public Integer getUserId() {
return this.userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
@Column(name = "UserName", length = 100)
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name = "EmailId", nullable = false, length = 45)
public String getEmailId() {
return this.emailId;
}
public void setEmailId(String emailId) {
this.emailId = emailId;
}
@Column(name = "EncryptedPwd", length = 100)
public String getEncryptedPwd() {
return this.encryptedPwd;
}
public void setEncryptedPwd(String encryptedPwd) {
this.encryptedPwd = encryptedPwd;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
@Column(name = "UpdatedBy", length = 100)
public String getUpdatedBy() {
return this.updatedBy;
}
public void setUpdatedBy(String updatedBy) {
this.updatedBy = updatedBy;
}
}
In Spring MVC Controller kann ich mit DAO das Objekt abrufen. und als JSON-Objekt zurückkehren.
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/getUser/{userId}", method = RequestMethod.GET)
@ResponseBody
public User getUser(@PathVariable Integer userId) throws Exception {
User user = userService.get(userId);
user.setCreatedBy(null);
user.setUpdatedBy(null);
return user;
}
}
Der Ansichtsteil wird mit AngularJS ausgeführt, sodass JSON wie folgt angezeigt wird
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]",
"encryptedPwd" : "Co7Fwd1fXYk=",
"createdBy" : null,
"updatedBy" : null
}
Wenn ich kein verschlüsseltes Passwort festlegen möchte, setze ich dieses Feld auch auf null.
Aber ich möchte nicht so, ich möchte nicht alle Felder an die Client-Seite senden. Wenn ich nicht möchte, dass ein Passwort gesendet, aktualisiert durch, erstellt von Feldern gesendet wird, sollte mein Ergebnis JSON wie folgt sein
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]"
}
Die Liste der Felder, die ich nicht an den Client senden möchte, stammt aus einer anderen Datenbanktabelle. Es ändert sich also je nach dem angemeldeten Benutzer. Wie kann ich das tun?
Ich hoffe du hast meine Frage bekommen.
quelle
Antworten:
Fügen Sie die
@JsonIgnoreProperties("fieldname")
Anmerkung Ihrem POJO hinzu.Oder Sie können
@JsonIgnore
vor dem Namen des Felds verwenden, das Sie beim Deserialisieren von JSON ignorieren möchten. Beispiel:GitHub Beispiel
quelle
@JsonIgnore
istcom.fasterxml.jackson.annotation.JsonIgnore
nichtorg.codehaus.jackson.annotate.JsonIgnore
.Ich weiß, dass ich ein bisschen zu spät zur Party komme, aber ich bin auch vor ein paar Monaten darauf gestoßen. Alle verfügbaren Lösungen waren für mich nicht sehr ansprechend (Mixins? Ugh!), Daher habe ich eine neue Bibliothek erstellt, um diesen Prozess sauberer zu gestalten. Es ist hier verfügbar, wenn jemand es ausprobieren möchte: https://github.com/monitorjbl/spring-json-view .
Die grundlegende Verwendung ist ziemlich einfach. Sie verwenden das
JsonView
Objekt in Ihren Controller-Methoden wie folgt :Sie können es auch außerhalb des Frühlings verwenden:
quelle
Ansichtsklasse erstellen:
Kommentieren Sie Ihr Modell
Geben Sie die Ansichtsklasse in Ihrem Controller an
Datenbeispiel:
quelle
Wir können dies tun, indem wir den Zugriff auf
JsonProperty.Access.WRITE_ONLY
festlegen , während wir die Eigenschaft deklarieren.quelle
Hinzufügen
@JsonInclude(JsonInclude.Include.NON_NULL)
(zwingt Jackson, Nullwerte zu serialisieren) sowohl zur Klasse als auch@JsonIgnore
zum Kennwortfeld.Sie können natürlich auch
@JsonIgnore
auf createdBy und updatedBy setzen, wenn Sie dies immer ignorieren möchten und nicht nur in diesem speziellen Fall.AKTUALISIEREN
Für den Fall, dass Sie die Anmerkung nicht zum POJO selbst hinzufügen möchten, sind Jacksons Mixin-Anmerkungen eine gute Option. Lesen Sie die Dokumentation
quelle
Ja, Sie können angeben, welche Felder als JSON-Antwort serialisiert und welche ignoriert werden sollen. Dies müssen Sie tun, um Eigenschaften dynamisch ignorieren zu implementieren.
1) Zuerst müssen Sie @JsonFilter aus com.fasterxml.jackson.annotation.JsonFilter zu Ihrer Entitätsklasse als hinzufügen.
2) Dann müssen Sie in Ihrem Controller das MappingJacksonValue-Objekt erstellen und Filter darauf setzen, und am Ende müssen Sie dieses Objekt zurückgeben.
Folgendes erhalten Sie als Antwort:
an Stelle von:
Hier sehen Sie, dass andere Eigenschaften (in diesem Fall Feld3) als Antwort ignoriert werden, mit Ausnahme der Eigenschaften Feld1 und Feld2.
Hoffe das hilft.
quelle
Wenn ich Sie wäre und dies tun wollte, würde ich meine Benutzerentität nicht in der Controller-Schicht verwenden. Stattdessen erstelle ich UserDto (Datenübertragungsobjekt) und verwende es, um mit der Geschäftsschicht (Service) und dem Controller zu kommunizieren. Sie können Apache BeanUtils (copyProperties-Methode) verwenden, um Daten von der Benutzerentität nach UserDto zu kopieren.
quelle
Ich habe ein JsonUtil erstellt, mit dem Felder zur Laufzeit ignoriert werden können, während eine Antwort gegeben wird.
Beispielverwendung: Das erste Argument sollte eine beliebige POJO-Klasse (Student) sein, und ignoreFields ist ein durch Kommas getrenntes Feld, das Sie als Antwort ignorieren möchten.
quelle
Ich habe nur mit gelöst,
@JsonIgnore
wie @kryger vorgeschlagen hat. So wird Ihr Getter:Sie können
@JsonIgnore
natürlich wie hier beschrieben auf Feld, Setter oder Getter einstellen .Wenn Sie das verschlüsselte Kennwort nur auf der Serialisierungsseite schützen möchten (z. B. wenn Sie Ihre Benutzer anmelden müssen), fügen Sie diese
@JsonProperty
Anmerkung zu Ihrem Feld hinzu :Mehr Infos hier .
quelle
Ich habe mit Spring und Jackson eine Lösung für mich gefunden
Geben Sie zuerst den Filternamen in der Entität an
Anschließend können Sie die Konstantenfilter-Namensklasse mit dem StandardfilterProvider anzeigen, der in der Frühlingskonfiguration verwendet wird
Federkonfiguration:
Schließlich kann ich einen bestimmten Filter in restConstoller angeben, wenn ich brauche ....
quelle
Platzieren Sie es
@JsonIgnore
auf dem Feld oder seinem Getter oder erstellen Sie ein benutzerdefiniertes dtooder wie oben erwähnt, indem Sie
ceekay
es mit@JsonProperty
dem Hinweis versehen, dass das Zugriffsattribut nur zum Schreiben festgelegt istquelle
Würde keine erstellen
UserJsonResponse
sauberer Klasse zu und mit den gewünschten Feldern zu füllen?Die direkte Rückgabe eines JSON scheint eine gute Lösung zu sein, wenn Sie das gesamte Modell zurückgeben möchten. Sonst wird es nur chaotisch.
In Zukunft möchten Sie beispielsweise möglicherweise ein JSON-Feld haben, das keinem Modellfeld entspricht, und dann haben Sie größere Probleme.
quelle
Dies ist ein sauberes Hilfsprogramm für die obige Antwort :
quelle
Fügen Sie in Ihrer Entitätsklasse hinzu
@JsonInclude(JsonInclude.Include.NON_NULL)
Anmerkungen hinzu, um das Problem zu behebenes wird so aussehen
quelle