在restlet中没有获取响应JAXBRepresentation的数据

时间:2015-11-15 14:30:17

标签: jaxb osgi restlet apache-karaf

我是Web服务的新手,目前正在尝试在Apache Karaf上设置Restlet。 My Core bundle使用Protocol:HTTP启动组件。和港口:8081。

我创建了一个组件,其中使用HTTP协议和通过属性配置的端口号。

应用程序作为

附加到默认主机
wsComponent.getDefaultHost().attach(restletApp.getURI(),restletApp);

在上面的getURI函数中,返回附加了应用程序的URL。

我正在尝试使用JaxbRepresentation来获取详细信息。服务器资源类如下:

@Get
public Representation getAllUsers()
{
    List<MyUser> allUsers = MyFactory.getInstance().getAllUsers();
    MyUserListXML userListXML = new MyUserListXML(MyUserConverter.convertMyUserList(allUsers));
    JaxbRepresentation<MyUserListXML> userReps = new JaxbRepresentation<MyUserListXML>(userListXML);
    userReps.setFormattedOutput(true);
    return userReps;
}

MyUserListXML.java:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"user"})
@XmlRootElement(name="myUsers")
public class MyUserListXML implements Serializable
{

    private static final long   serialVersionUID    = 1L;
    @XmlElement(name="user")
    private List<MyUserXML> userList;

    public MyUserListXML()
    {
        // Default Constructor
    }

    /**
     * @param userList
     */
    public MyUserListXML(List<MyUserXML> userList)
    {
        this.userList = userList;
    }

    /**
     * @return the userList
     */
    public List<MyUserXML> getUserList()
    {
        return userList;
    }

    /**
     * @param userList the userList to set
     */
    public void setUserList(List<MyUserXML> userList)
    {
        this.userList = userList;
    }
}

MyUserXML.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"id","userName","status","displayName","email"})
@XmlRootElement(name = "esmfUser")
public class MyUserXML implements Serializable
{

    private static final long   serialVersionUID    = 1L;

    @XmlElement(name= "id", required=true,type=Integer.class)
    private Integer userId;
    @XmlElement(required=true)
    private String  userName;
    @XmlElement(name="status",required=true)
    private String  userStatus;
    @XmlElement(required=true)
    private String  displayName;
    @XmlElement(required=true)
    private String  email;

    public MyUserXML()
    {
        // default constructor.
    }

    /**
     * @param userId
     * @param userName
     * @param userStatus
     * @param displayName
     * @param email
     */
    public MyUserXML(Integer userId, String userName, String userStatus, String displayName, String email)
    {
        this.userId = userId;
        this.userName = userName;
        this.userStatus = userStatus;
        this.displayName = displayName;
        this.email = email;
    }

    /**
     * @return the userId
     */
    public Integer getUserId()
    {
        return userId;
    }

    /**
     * @param userId the userId to set
     */
    public void setUserId(Integer userId)
    {
        this.userId = userId;
    }

    /**
     * @return the userName
     */
    public String getUserName()
    {
        return userName;
    }

    /**
     * @param userName the userName to set
     */
    public void setUserName(String userName)
    {
        this.userName = userName;
    }

    /**
     * @return the userStatus
     */
    public String getUserStatus()
    {
        return userStatus;
    }

    /**
     * @param userStatus the userStatus to set
     */
    public void setUserStatus(String userStatus)
    {
        this.userStatus = userStatus;
    }

    /**
     * @return the displayName
     */
    public String getDisplayName()
    {
        return displayName;
    }

    /**
     * @param displayName the displayName to set
     */
    public void setDisplayName(String displayName)
    {
        this.displayName = displayName;
    }

    /**
     * @return the email
     */
    public String getEmail()
    {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email)
    {
        this.email = email;
    }

}

在使用soapUI进行测试时,我收到了以下请求和响应

请求:

GET http://localhost:8081/ws/users HTTP/1.1
Accept-Encoding: gzip,deflate
Host: localhost:8081
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

响应:

HTTP/1.1 200 OK
Content-encoding: gzip, zip, deflate
Server: Restlet-Framework/2.3.5
Date: Sun, 15 Nov 2015 09:29:31 GMT
Transfer-encoding: chunked
Content-type: application/xml; charset=UTF-8
Vary: Accept-Charset, Accept-Encoding, Accept-Language, Accept
Accept-ranges: bytes

我不知道为什么我没有收到xml数据。任何人都可以帮助我或指导我做错了什么。

Restlet版本:2.3.5

2 个答案:

答案 0 :(得分:0)

我能够解决这个问题。

我创建了ObjectFactory类但更改了它的名称。由于这个JaxbContext无法找到ObjectFactory类。由于我在Osgi中使用restlet并且还无法弄清楚如何使用Restlet,因此Osgi Log Service没有看到来自restlet的任何错误消息。

答案 1 :(得分:0)

关于JaxB的问题,您至少应该看到警告日志跟踪,可能还有IOException。我看看你创建的问题(https://github.com/restlet/restlet-framework-java/issues/1166)。 如果要列出Restlet框架中的所有日志跟踪,实际上是从项目中包含的任何其他类型的库中列出并且不依赖于OSGi LogService,则必须根据每个库要求配置日志( JUL,Log4j,slf4j等)。由于OSGi容器基本上是一个JVM,因此配置每个记录器没有问题。 关于Restlet Framework,您可以阅读此页面:http://restlet.com/technical-resources/restlet-framework/guide/2.3/editions/jse/logging 某些技术(如slf4j)有助于共享不同的日志系统。如果需要,您应该能够将所有日志倒入OSGi LogService。