3

私は春のフレームワーク 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

お気づきのように、シリアル化する必要がある明示的なモデル キーを指定していないため、null 以外の値を持つ最初のモデル オブジェクトをシリアル化しています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>
于 2013-01-22T01:06:07.233 に答える
0

XStream で同じエラーが発生しましたが、次の変更を適用することで解決しました。

modelKey を追加する代わりに、「supportedClasses」プロパティを Marshaller Bean に追加できます。


<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 に答える