[英]Dropwizard REST problems
我使用dropwizard(球衣,杰克逊)创建一个REST API,并在一些问题,我似乎无法找到答案都有所涉猎。 我想建立一个基于json文件的sql查询。 这将通过图(标准值)来完成。 我在实现此功能时遇到一些问题:
码:
UserResource:
@POST
@Path("/list")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public List<User> getUser(@Auth UserToken token, JSONObject json) {
return userDAO.getUserByCriteria(json);
}
UserDao:
List<User> getInvoiceByCriteria(@Bind("json") JSONObject json);
当我使它正常工作时,我将如何处理? 我的代码看起来像这样(似乎无法为此代码格式化):
@SqlQuery(“ SELECT * FROM user LIMIT 10”)
@RegisterRowMapper(UserMapper.class)
清单getUserByCriteria(@Bind( “JSON”)地图JSON);
我想使其执行以下操作:
@SqlQuery("SELECT * FROM user WHERE crit1 = :crit1 AND crit2 = :crit2 LIMIT 10")
@RegisterRowMapper(UserMapper.class)
List<User> getUserByCriteria(@Bind("json") Map json){
//EXTRACT VALUES OF MAP HERE
//
};
我意识到这是一个非常模糊的问题。 问题是我在这个REST的东西,我遇到的问题一个相当大的小白是并不常见(或我在寻找错误的事情)。 任何帮助/见解,不胜感激!
有关http / rest的Xtra问题:我觉得这应该是GET请求而不是POST,但是我的Advanced Rest Client不允许GET请求中包含正文。 我在网上发现,这通常没有完成,但被允许。 在这里可以使用POST吗?
我将首先回答您的Xtra问题:
GET的目的是使用URI和在URI中发送的参数检索数据。 黑白可以或应该有区别。 使用GET的主体与使用主体相同,您可以使用GET发送主体,但是您没有遵循HTTP准则,因此GET和POST的目的混合在一起。 < 参考此处 >和< 这里 >
现在在您的问题。 您正在发送JSONObject json
public List<User> getUser(@Auth UserToken token, JSONObject json) {
return userDAO.getUserByCriteria(json);
}
但您与地图匹配。 Map基本上是TypeErasure <,这意味着在编译代码时,集合的泛型将被此的绑定对象替换>您可以在必要时插入Type强制类型转换,以保持类型安全。 你也可以用这样的东西
List<User> getInvoiceByCriteria(@Bind("json") Map<K extends String , V extends MyObject> json);
这是一个使用Mapper的DAO接口的简单示例:
@RegisterMapper(EmployeeMapper.class)
public interface EmployeeDao {
@SqlQuery("select * from employee;")
public List<Employee> getEmployees();
@SqlQuery("select * from employee where id = :id")
public Employee getEmployee(@Bind("id") final int id);
@SqlUpdate("insert into employee(name, department, salary) values(:name, :department, :salary)")
void createEmployee(@BindBean final Employee employee);
@SqlUpdate("update employee set name = coalesce(:name, name), " +
" department = coalesce(:department, department), salary = coalesce(:salary, salary)" +
" where id = :id")
void editEmployee(@BindBean final Employee employee);
@SqlUpdate("delete from employee where id = :id")
int deleteEmployee(@Bind("id") final int id);
@SqlQuery("select last_insert_id();")
public int lastInsertId();
}
这是上面使用的Employee Mapper类:
public class EmployeeMapper implements ResultSetMapper<Employee> {
private static final String ID = "id";
private static final String NAME = "name";
private static final String DEPARTMENT = "department";
private static final String SALARY = "salary";
public Employee map(int i, ResultSet resultSet, StatementContext statementContext)
throws SQLException {
Employee employee = new Employee(resultSet.getString(NAME), resultSet.getString(DEPARTMENT),resultSet.getInt(SALARY));
employee.setId(resultSet.getInt(ID));
return employee;
}
}
我已经在博客文章中以简单的步骤解释了如何使用JDBI,在Dropwizard中创建REST API,并且还在GitHub上创建了一个示例工作应用程序。 请检查: http : //softwaredevelopercentral.blogspot.com/2017/08/dropwizard-mysql-integration-tutorial.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.