2012-04-10 20 views
15

Próbuję uczynić właściwość w klasie domeny ukrytą, ale nadal pojawia się w wyjściowym JSON. Używam Jackson 2.0 i wiosna 3.1.1Adnotacje Jacksona są ignorowane na wiosnę

wyjściu/Users/1:

{"id":1,"password":null,"email":"[email protected]","firstName":"John","lastName":"Smith"} 

Moja klasa domeny:

@Entity 
public class User { 
    private String mPassword; 
    ... 
    @JsonIgnore 
    public String getPassword() { 
     return mPassword; 
    } 

    public void setPassword(String password) { 
     mPassword = password; 
    } 
    ... 
} 

Moja springmvc config:

... 
<mvc:annotation-driven/> 
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="favorPathExtension" value="true" /> 
    <property name="mediaTypes"> 
     <map> 
      <entry key="json" value="application/json"/> 
     </map> 
    </property> 
    <property name="defaultContentType" value="application/json"/> 
    <property name="defaultViews"> 
     <list> 
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
     </list> 
    </property> 
</bean> 
... 

I mój kontroler:

@Controller 
@RequestMapping("/users") 
public class UserController { 
    private UserService mUserService; 

    public UserController(){} 

    @Inject 
    public void setUserController(UserService userService){ 
     mUserService=userService; 
    } 

    @RequestMapping(value="/{id}", method=RequestMethod.GET) 
    public void getUser(@PathVariable("id") long id, Model model){ 
     model.addAttribute(mUserService.getUser(id)); 
    } 
} 

Odpowiedz

10

Problem polega na tym, że Spring nie działa z Jacksonem 2.0. Zostało to rozwiązane w następujący sposób:

<bean id="jacksonMessageConverter" 
      class="own.implementation.of.MappingJacksonHttpMessageConverter"/> 

<bean class="org.springframework.web.servlet.mvc 
      .annotation.AnnotationMethodHandlerAdapter"> 
     <property name="messageConverters"> 
      <list> 
       <ref bean="jacksonMessageConverter"/> 
      </list> 
     </property> 
     <property name="requireSession" value="false"/> 
    </bean> 

A own.implementation.of.MappingJacksonHttpMessageConverter opiera się na tym:

http://www.jarvana.com/jarvana/view/org/springframework/spring-web/3.0.0.RELEASE/spring-web-3.0.0.RELEASE-sources.jar!/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java?format=ok

Ale używać ObjectMapper i innych klas Jackson z Jackson 2,0 zamiast Jackson 1. *

+0

Myślę, że po prostu przejdę na wersję Jackson 1.9, która wydaje się rozwiązać mój problem. –

+0

Chyba, że ​​potrzebujesz funkcji od 2.0 (takich jak przekazywanie obiektów z dwukierunkowymi relacjami). Właśnie dlatego uaktualniłem do wersji 2.0. –

0

Moja konfiguracja wygląda następująco

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="1"> 
    <property name="mediaTypes"> 
    <map> 
     <entry key="html" value="text/html"/> 
     <entry key="json" value="application/json"/> 
    </map> 
    </property> 
    <property name="viewResolvers"> 
    <!-- this is not important for your jackson problem --> 
    <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" p:order="2" depends-on="tilesConfigurer"/> 
    </property> 
    <property name="defaultViews"> 
    <list> 
     <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/> 
    </list> 
    </property> 
</bean> 

Mój kontroler wygląda to

@Controller 
public class SearchController { 
    @RequestMapping(value="/search", method = {RequestMethod.GET, RequestMethod.POST}) 
    public SearchResponse search(@RequestParam(value = QUERY, required = true) String query) { 
     return generateSearchResponse(query); 
    } 
}  

Moja SearchResponse jest bardziej złożona struktura zawiera jednak tego typu obiektów.

@JsonIgnoreProperties({ "popis" }) 
public class Kurz implements Serializable { 
    private String nazev; 
    private String popis; 
} 
+0

Dodanie nieruchomości nie miało żadnego znaczenia, prawdopodobnie nie jest wymagane. –

+0

Spróbuj umieścić ignoruj ​​adnotację na polu, nie pobierając. Myślę, że Jackson domyślnie odczytał i ustawił bezpośrednio pole formularza. – chalimartines

+0

Obawiam się, że to nie zadziałało. Nie sądzę, że używa on Jacksona - jest w stanie serializować JSON bez dostępnego słoika Jacksona. Również nie powinienem używać @ResponseBody z ContentNegotiatingViewResolver, zamiast tego powinienem zwrócić widok "json" lub użyć zamiast niego HttpMessageConverter. –

11

Obsługa dodatku Jackson 2 została dodana do wersji Spring 3.1.2 (przeniesiona ze źródła 3.2 - SPR-9507). Po prostu uaktualnij swój projekt ze Spring 3.1.1 do Spring 3.1.2, a Jackson 2 działa z konfiguracją, którą już posiadasz.

8

Poza uaktualnieniem do Spring 3.1.2, trzeba także zmienić konwerter wiadomość do org.springframework.web.servlet.view.json.MappingJackson**2**HttpMessageConverter

8

Jeśli używasz sprężyna 4 wersji, trzeba będzie zrobić po, zaktualizuj zależność

<dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.3.3</version> 
    </dependency> 

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.3.3</version> 
</dependency> 

Wymienić starsze przypisanie do komentarza codehaus do, jeśli tego nie robisz, Twoja starsza adnotacja jak JsonIgnoreProperties nie będzie działać z nową wersją Jackson'a

import com.fasterxml.jackson.annotation.*; 

Usunąć mediaTypes z dołu, zostało przestarzałe.

ContentNegotiatingViewResolver

, nie potrzebne, zostaną odebrani z ramowym aktywacja słoika, widok Jackson należy używać

MappingJackson2JsonView

<beans:property name="viewResolvers"> 
    <beans:list> 
     <beans:bean 
      class="org.springframework.web.servlet.view.BeanNameViewResolver" /> 
     <beans:bean 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
      <beans:property name="prefix" value="/WEB-INF/views/" /> 
      <beans:property name="suffix" value=".jsp" /> 
     </beans:bean> 
     <beans:bean 
      class="org.springframework.web.servlet.view.tiles3.TilesViewResolver"> 
      <beans:property name="viewClass" 
       value="org.springframework.web.servlet.view.tiles3.TilesView"></beans:property> 
      <beans:property name="order" value="0"></beans:property> 
     </beans:bean> 
    </beans:list> 
</beans:property> 
<beans:property name="defaultViews"> 
    <beans:list> 
     <beans:bean 
      class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" /> 
    </beans:list> 
</beans:property> 

Powiązane problemy