2012-04-10 5 views
15

Я пытаюсь сделать свойство в классе домена скрытым, но он продолжает отображаться в выведенном JSON. Я использую Джексон 2.0 и Spring 3.1.1Ярлыки Jackson игнорируются весной

Выход из/пользователи/1:

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

Мой домен класс:

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

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

Мой SpringMVC конфигурации:

... 
<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> 
... 

И мой контроллер:

@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)); 
    } 
} 

ответ

10

Проблема в том, что Spring не работает с Jackson 2.0. Это была решена следующим образом:

<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> 

И own.implementation.of.MappingJacksonHttpMessageConverter на этом основано:

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

Но использовать ObjectMapper и другие классы Джексона от Джексона 2.0 вместо от Jackson 1. *

+0

Я думаю, что я просто перейду на Jackson 1.9, который, кажется, решает мою проблему. –

+0

Если вам не нужны функции из 2.0 (например, объекты передачи с двунаправленными отношениями). Вот почему я обновил до 2.0. –

0

Моя конфигурация выглядит следующим образом

<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> 

Мой контроллер выглядит следующим образом

@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); 
    } 
}  

Мой SearchResponse является более сложной структурой, но она содержит этот тип объектов.

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

Добавление собственности, похоже, не имеет никакого значения, это, вероятно, не требуется. –

+0

Попробуйте поставить аннотацию игнорирования на поле, а не геттер. Я думаю, что Джексон по умолчанию читает и устанавливает прямое поле формы. – chalimartines

+0

Боюсь, что это не сработало. Я не думаю, что он использует Джексона - он способен сериализовать JSON без возможности использования Джексон-банки. Также я не должен использовать @ResponseBody с ContentNegotiatingViewResolver, вместо этого я должен вернуть представление «json» или вместо него использовать HttpMessageConverter. –

11

Поддержка Jackson 2 была добавлена ​​к Spring 3.1.2 (backported from Spring 3.2 - SPR-9507). Просто обновите свой проект с Spring 3.1.1 до Spring 3.1.2, а Jackson 2 работает с уже имеющейся конфигурацией.

8

В дополнение к обновлению до Spring 3.1.2, вы также должны изменить конвертер сообщение для org.springframework.web.servlet.view.json.MappingJackson**2**HttpMessageConverter

8

Если вы используете версию Spring 4, Вы должны сделать следующее, обновить зависимость

<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> 

Заменить более старый код-код для импорта комментариев в следующий, если этого не сделать, ваша старшая аннотация, такая как JsonIgnoreProperties, не будет работать с новой версией Jackson

import com.fasterxml.jackson.annotation.*; 

Удалить mediaTypes снизу, он устарел.

ContentNegotiatingViewResolver

, не нужен будет забираться из рамочной активации баночки, Джексон виду следует использовать

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>