繁体   English   中英

Dropwizard REST问题

[英]Dropwizard REST problems

我使用dropwizard(球衣,杰克逊)创建一个REST API,并在一些问题,我似乎无法找到答案都有所涉猎。 我想建立一个基于json文件的sql查询。 这将通过图(标准值)来完成。 我在实现此功能时遇到一些问题:

  • 调用DAO方法getUserByCriteria(图/ JSONObject的)会给我这种类型的错误:UnsupportedOperationException异常:未找到擦除型“接口java.util.Map [K,V]”类型参数。 要绑定通用类型,最好使用bindByType。 还是显得我不能一个“不争论工厂”的错误重现大气压

码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM