Mam taką klasę modelu do hibernacji
@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;
}
}
W kontrolerze Spring MVC za pomocą DAO jestem w stanie pobrać obiekt. i zwracając jako obiekt JSON.
@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;
}
}
Część widoku jest wykonywana za pomocą AngularJS, więc otrzyma taki kod JSON
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]",
"encryptedPwd" : "Co7Fwd1fXYk=",
"createdBy" : null,
"updatedBy" : null
}
Jeśli nie chcę ustawiać zaszyfrowanego hasła, ustawię to pole również na null.
Ale nie chcę tego, nie chcę wysyłać wszystkich pól po stronie klienta. Jeśli nie chcę hasła, aktualizowanego przez, utworzonego przez pola do wysłania, mój wynik JSON powinien być podobny
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]"
}
Lista pól, których nie chcę wysyłać do klienta pochodząca z innej tabeli bazy danych. Więc będzie się to zmieniać w zależności od zalogowanego użytkownika. Jak mogę to zrobić?
Mam nadzieję, że masz moje pytanie.
java
json
hibernate
spring-mvc
iCode
źródło
źródło
Odpowiedzi:
Dodaj
@JsonIgnoreProperties("fieldname")
adnotację do swojego POJO.Lub możesz użyć
@JsonIgnore
przed nazwą pola, które chcesz zignorować podczas deserializacji JSON. Przykład:Przykład GitHub
źródło
@JsonIgnore
tocom.fasterxml.jackson.annotation.JsonIgnore
nieorg.codehaus.jackson.annotate.JsonIgnore
.Wiem, że jestem trochę spóźniony na imprezę, ale tak naprawdę spotkałem to kilka miesięcy temu. Wszystkie dostępne rozwiązania nie były dla mnie zbyt atrakcyjne (mieszanki? Hmm!), Więc ostatecznie stworzyłem nową bibliotekę, aby ten proces był czystszy. Jest dostępny tutaj, jeśli ktoś chciałby go wypróbować: https://github.com/monitorjbl/spring-json-view .
Podstawowe użycie jest dość proste, używasz
JsonView
obiektu w metodach kontrolera w następujący sposób:Możesz go również używać poza wiosną:
źródło
Utwórz klasę widoku:
Opisz swój model
Określ klasę widoku w kontrolerze
Przykład danych:
źródło
Możemy to zrobić, ustawiając dostęp do
JsonProperty.Access.WRITE_ONLY
podczas deklarowania właściwości.źródło
Dodaj
@JsonInclude(JsonInclude.Include.NON_NULL)
(wymusza na Jacksonie serializowanie wartości null) do klasy, a także@JsonIgnore
do pola hasła.Możesz oczywiście ustawić
@JsonIgnore
na createdBy i updatedBy, jeśli zawsze chcesz ignorować to, a nie tylko w tym konkretnym przypadku.AKTUALIZACJA
Jeśli nie chcesz dodawać adnotacji do samego POJO, świetną opcją jest Mixin Annotations Jacksona. Sprawdź dokumentację
źródło
Tak, możesz określić, które pola są serializowane jako odpowiedź JSON, a które zignorować. Oto, co musisz zrobić, aby zaimplementować Dynamicznie ignoruj właściwości.
1) Najpierw musisz dodać @JsonFilter z com.fasterxml.jackson.annotation.JsonFilter do swojej klasy encji jako.
2) Następnie w kontrolerze musisz dodać stwórz obiekt MappingJacksonValue i ustawić na nim filtry, a na koniec musisz zwrócić ten obiekt.
Oto, co otrzymasz w odpowiedzi:
zamiast tego:
Tutaj możesz zobaczyć, że ignoruje inne właściwości (w tym przypadku pole3) w odpowiedzi, z wyjątkiem właściwości field1 i field2.
Mam nadzieję że to pomoże.
źródło
Gdybym był Tobą i chciałbym to zrobić, nie używałbym swojej encji użytkownika w warstwie kontrolera, zamiast tego tworzę i używam UserDto (obiekt transferu danych) do komunikacji z warstwą biznesową (usługową) i Administratorem. Możesz użyć Apache BeanUtils (metoda copyProperties), aby skopiować dane z jednostki User do UserDto.
źródło
Utworzyłem JsonUtil, który może służyć do ignorowania pól w czasie wykonywania podczas udzielania odpowiedzi.
Przykład zastosowania: Pierwszy argument powinien być dowolną klasą POJO (Student), a ignoreFields to pola oddzielone przecinkami, które chcesz zignorować w odpowiedzi.
źródło
Rozwiązałem, używając tylko
@JsonIgnore
tego, co zasugerował @kryger. Więc twój getter stanie się:Możesz ustawić
@JsonIgnore
oczywiście na pole, setter lub getter, jak opisano tutaj .A jeśli chcesz chronić zaszyfrowane hasło tylko po stronie serializacji (np. Kiedy musisz zalogować się do swoich użytkowników), dodaj tę
@JsonProperty
adnotację do swojego pola :Więcej informacji tutaj .
źródło
Znalazłem dla mnie rozwiązanie dzięki Springowi i Jacksonowi
Najpierw określ nazwę filtru w encji
Następnie możesz zobaczyć klasy nazw filtrów stałych z domyślnym filtrem FilterProvider używanym w konfiguracji sprężynowej
Konfiguracja sprężyn:
Ostatecznie mogę określić konkretny filtr w restConstoller, kiedy potrzebuję ....
źródło
Umieść
@JsonIgnore
na polu lub jego getterze lub stwórz własne dtolub jak wspomniano powyżej,
ceekay
dodając do niego adnotację,@JsonProperty
gdzie atrybut dostępu jest ustawiony na tylko zapisźródło
Czy utworzenie
UserJsonResponse
klasy i wypełnienie żądanymi polami nie byłoby czystszym rozwiązaniem?Zwracanie bezpośrednio JSON wydaje się świetnym rozwiązaniem, gdy chcesz oddać cały model. W przeciwnym razie robi się po prostu bałagan.
Na przykład w przyszłości możesz chcieć mieć pole JSON, które nie pasuje do żadnego pola Model, a wtedy masz większe kłopoty.
źródło
To jest czyste narzędzie użytkowe dla powyższej odpowiedzi :
źródło
W swojej klasie encji dodaj
@JsonInclude(JsonInclude.Include.NON_NULL)
adnotację, aby rozwiązać problembędzie wyglądać
źródło