1

Jackson、Jersey、EclipseLink、および Tomcat を使用した小さな RESTful Web サービスがあります。ほとんどの場合、ネストされた子要素を除いて、XML は期待どおりに機能しています。XML ドキュメントの残りの部分がそうでない場合、名前空間属性を使用して記述されます。応答 XML のサンプルを次に示します。

<userView>
    <userIdSID>5</userIdSID>
    <userAuthLevel>5</userAuthLevel>
    <userRoles>
        <roleSID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:decimal">1</roleSID>
        <roleSID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:decimal">3</roleSID>
        <roleSID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:decimal">2</roleSID>
        <roleSID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:decimal">8</roleSID>
        <roleSID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:decimal">5</roleSID>
        <roleSID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:decimal">4</roleSID>
        <roleSID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:decimal">9</roleSID>
        <roleSID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:decimal">1000001</roleSID>
    </userRoles>
</userView>

これは私の UserRoleList.java がどのように見えるかです:

package com.company.project;

import java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@XmlAccessorType(XmlAccessType.FIELD)
public class UserRoleList implements Serializable {

    private int userRoleSID;

    public int getUserRoleSid() {
        return userRoleSID;
    }

    public void setUserRoleSid(int userRoleSid) {
        this.userRoleSID = userRoleSid;
    }
}

これは私の UserView.java がどのように見えるかです:

package com.company.project;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class UserView implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "USER_ID_SID")
    private String userIdSID;
    @Basic(optional = true)
    private String userAuthLevel;
    @XmlElementWrapper(name = "userRoles")
    @XmlElement(name = "roleSID")
    private List<UserRoleList> userRoleList = new ArrayList<UserRoleList>();

    public UserView() {
    }

    public UserView(String userIdSID) {
        this.userIdSID = userIdSID;
    }

    public String getUserIdSID() {
        return userIdSID;
    }

    public void setUserIdSID(String userIdSID) {
        this.userIdSID = userIdSID;
    }

    public List<UserRoleList> getUserRoleList() {
        return userRoleList;
    }

    public void setUserRoleList(List<UserRoleList> userRoleList) {
        this.userRoleList = userRoleList;
    }

    public String getUserAuthLevel() {
        return userAuthLevel;
    }

    public void setUserAuthLevel(String userAuthLevel) {
        this.userAuthLevel = userAuthLevel;
    }
}

これは、そのネスト要素にデータを入力する方法です。2 つの受信パラメーターを取り、エンティティ マネージャーを介してクエリを実行します。

 List<UserRoleList> userRoleList = em.createNamedQuery("findRoleListByLoginName")
                    .setParameter(1, id)
                    .setParameter(2, client)
                    .getResultList();

どこに何かが欠けている可能性があるかについて何か考えはありますか? pkg-info を使用してみましたが、役に立ちませんでした。この出力は、そこから生成されたスキーマを持たない XML を構築することに注意してください。それが役立つか妨げになるかはわかりませんが、どんな支援も大歓迎です。

更新 1 : 要求に応じて、ここに私の web.xml があります。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>moxyWS</display-name>
    <servlet>
        <servlet-name>ServletAdaptor</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <description>Multiple packages, separated by semicolon(;), can be specified in param-value</description>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.project.moxyws</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletAdaptor</servlet-name>
        <url-pattern>/webresources/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    <persistence-unit-ref>
        <persistence-unit-ref-name>persistence-factory</persistence-unit-ref-name>
        <persistence-unit-name>moxyWS_war_1.0-SNAPSHOTPU</persistence-unit-name>
    </persistence-unit-ref>
</web-app>

更新 2 : 要求に応じて、ここに私の REST Facade があります。

package com.project.moxyws.service;

import com.project.moxyws.UserView;
import com.project.moxyws.controller.UserViewJPAController;
import javax.naming.NamingException;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;

@Path("request")
public class UserViewRESTFacade {

    private EntityManagerFactory getEntityManagerFactory() throws NamingException {
        return (EntityManagerFactory) Persistence
                .createEntityManagerFactory("moxyWS_war_1.0-SNAPSHOTPU");
    }

    private UserViewJPAController getJpaController() {
        try {
            return new UserViewJPAController(getEntityManagerFactory());
        } catch (NamingException ex) {
            throw new RuntimeException(ex);
        }
    }

    public UserViewRESTFacade() {
    }

    @GET
    @Path("{client}/{id}")
    @Produces({"application/xml", "application/json"})
    public UserView findUserByClientAndID(@PathParam("client") String client, @PathParam("id") String id) {
        try {
            return getJpaController().findUserId(id, client);
        } catch (Exception e) {
            throw new WebApplicationException(204);
        }
    }
}
4

3 に答える 3

1

問題は UserRoleList クラスにあると思います。これは単一のフィールドを持つクラスであり、単純な型にマップしたいのです。userRoleSIDメンバーに注釈を付けてみることをお勧めします@XmlValue

于 2013-05-15T20:11:44.743 に答える