【问题标题】:Producing a XML view with a XStreamMarshaller Spring使用 XStreamMarshaller Spring 生成 XML 视图
【发布时间】:2013-01-05 03:44:25
【问题描述】:

我正在使用 spring 框架 3.1(带有休眠)并且我正在尝试生成如下 XML 表示:

<user>
<iduser>1</iduser>
<email>bla@hello.com</email>
<firstName>bob</firstName>
</user>

来自这个 java 类:

@Entity
public class User {

    @GenericGenerator(name = "table-hilo-generator", strategy = "org.hibernate.id.IncrementGenerator")
    @GeneratedValue(generator = "table-hilo-generator")
    @Id
    @Column(name = "iduser", unique = true, nullable = false)
    private int iduser;

    @NotBlank
    @NotNull
    @NotEmpty
    @Length(max = EMAIL_MAX_SIZE)
    @Column(name = "email", nullable = false)
    private String email;

    @NotBlank
    @NotNull
    @NotEmpty
    @Length(max = FIRST_NAME_MAX_SIZE)
    @Column(name = "firstName", nullable = false)
    private String firstName;
}

我的 servlet-conf.xml 在 ContentNegotiatingViewResolver 中包含此视图:

<!-- XML View -->
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
  <constructor-arg>
    <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="aliases">
        <map>
                <entry key="user123" value="com.....entities.User" />
        </map>
        </property>
    </bean>
   </constructor-arg>
</bean>

但我不明白为什么结果是一个包含数百个元素的奇怪 xml:

<org.springframework.validation.BeanPropertyBindingResult>
<nestedPath/>
<nestedPathStack serialization="custom">
<unserializable-parents/>
<vector>
<default>
<capacityIncrement>0</capacityIncrement>
<elementCount>0</elementCount>
<elementData>
<null/>
<null/>
<null/>
<null/>
<null/>
<null/>
<null/>
<null/>
<null/>
<null/>
</elementData>
</default>
</vector>
</nestedPathStack>
<objectName>user</objectName>
<messageCodesResolver class="org.springframework.validation.DefaultMessageCodesResolver">
<prefix/>

1-可能是编组器玩太多反射了,我怎样才能获得我想要的预期结果? (2-我也有兴趣生成一个包含用户列表的 XML 文件)我该怎么做?

【问题讨论】:

    标签: java xml spring-mvc marshalling spring-oxm


    【解决方案1】:

    正如您所指出的,由于您没有指定需要序列化的显式模型键,它正在序列化第一个非空值模型对象,在这种情况下,它恰好是 BindingResult(用于保留模型中的绑定/验证错误)。您可以进行一些修复:

    一个。为您的编组视图指定确切的modelKey,这应该可以工作并将模型设置为特定的模型键:

    <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
    <property name="marshaller">
    ...
    </property>
    <property name="modelKey" value="command"/>
    </bean>
    
    model.addAttribute("command", mymodel);
    

    b.一个更好的解决方法,恕我直言,可以在 Spring 中使用 http 转换器,这样您就可以从请求映射方法返回您的对象,用 @ResponseBody 注释它,Spring 将负责将对象转换为有线表示(xml 或json 等),您只需注册正确的转换器:

    @RequestMapping(...)
    public @ResponseBody User myMethod(Model model){
        return user;
    }
    
    <mvc:annotation-driven conversion-service="conversionService"> 
       <mvc:message-converters register-defaults="false"> <!-- you may have to explicitly register other converters though-->
           <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
               <property name="marshaller">
                   <bean class="org.springframework.oxm.xstream.XStreamMarshaller"/>
               </property>
           </bean>
       </mvc:message-converters>
    

    【讨论】:

      【解决方案2】:

      我在使用 XStream 时遇到了同样的错误,通过应用以下更改解决了这个错误:

      您可以将“supportedClasses”属性添加到 Marshaller bean,而不是添加 modelKey:


      <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
          <property name="autodetectAnnotations" value="true"/>
          <property name="supportedClasses">
              <list>
                  <value>com.rest.example.model.User</value>
              </list>
          </property>
      </bean>
      

      其次,类 User 应该使用 XStream 别名进行注释,否则您将在 XML 中获得完整的包名称 - 例如:&lt;com.rest.example.model.User&gt; 而不是 &lt;user&gt; - 修复它的方法是:

      @XStreamAlias("user")
      public class User {
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        • 2019-12-30
        • 2016-05-18
        • 1970-01-01
        相关资源
        最近更新 更多