3

我正在使用 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 文件)我该怎么做?

4

2 回答 2

0

就像您注意到的那样,发生的事情是因为您没有指定需要序列化的显式模型键,它正在序列化第一个非空值模型对象,在这种情况下它恰好是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);

湾。一个更好的解决方法,恕我直言,可以在 Spring 中使用 http 转换器,这样您就可以从请求映射方法返回您的对象,使用它进行注释,@ResponseBodySpring 将负责将对象转换为有线表示(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>
于 2013-01-22T01:06:07.233 回答
0

我对 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 中获得完整的包名称 - 例如:<com.rest.example.model.User>而不是<user>- 修复它的方法是:

@XStreamAlias("user")
public class User {
...
于 2013-08-10T05:48:12.930 回答