我是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
答案 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。