我在我的网络应用程序中使用Hibernate验证器进行表单验证.我在我的String属性中使用@Length注释,如下所示:
@Length(min = 5, message = "The field must be at least 5 characters")
private String myString;
Run Code Online (Sandbox Code Playgroud)
但是,如果String超过50个字符,我需要显示不同的消息.有没有办法使用开箱即用的@Length验证器来做到这一点?我想做的一个例子(编译器不会让我)如下:
@Length(min = 5, message = "The field must be at least 5 characters")
@Length(max = 50, message = "The field must be less than 50 characters")
private String myString;
Run Code Online (Sandbox Code Playgroud)
我试过@Max和@Min但他们没有做我想做的事.任何投入将不胜感激!
我正在研究和试验我的Java Web应用程序中的ThreadLocal变量.我使用ThreadLocal变量在请求之前存储用户名(从会话中收集),然后在请求后删除它.我通过在ServletFilter中调用静态实用程序方法来完成此操作.我不是简单地从会话中检索用户名的原因是因为我继承了一个系统,该系统具有长时间运行的进程,有时需要比会话超时允许的运行时间更长.我的想法是在处理请求之前获取用户名并将其存储在ThreadLocal变量中,这样我就可以在整个请求期间访问用户名,即使它花费的时间超过15分钟.
我的问题是:
这种设计是否存在任何安全/性能问题?如果有,那么什么是更好的解决方案?即使没有任何安全和/或性能问题,也欢迎更好的想法.我的解决方案中的代码段如下所示:
这是我的实用程序类,将在我的过滤器和我需要用户名的任何地方调用.
public abstract class UserUtil {
private static final ThreadLocal<String> threadUser = new ThreadLocal<String>();
public static String getUserId(){
return threadUser.get();
}
public static void setUserId(String userId){
threadUser.set(userId);
}
public static void removeUserId(){
threadUser.remove();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的servlet过滤器,用于在请求之前设置用户名(并在请求后通过finally块清除它).
public class UserFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void destroy() {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
try {
HttpServletRequest request = (HttpServletRequest) servletRequest;
UserBean userBean …Run Code Online (Sandbox Code Playgroud) 我在使用hibernate中的本机查询时遇到了麻烦,无法为包含枚举属性的bean设置别名.调用query.list()时,我收到一个InvocationTargetException.我的例子如下:
@Entity(name = "table1")
public class Class1 {
@Column(name = "col1")
@NotNull
private Integer prop1;
@Column(name = "col2")
@NotNull
private String prop2;
@Column(name = "col3", length = 6)
@Enumerated(value = EnumType.STRING)
private MyEnumType prop3;
// ... Getters/Setters...
}
public List getClass1List(){
String sql = "select col1 as prop1, col2 as prop2, col3 as prop3 from table1";
Session session = getSession(Boolean.FALSE);
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("col1", Hibernate.INTEGER);
query.addScalar("col2", Hibernate.STRING);
query.addScalar("col3", Hibernate.STRING);
query.setResultTransformer(Transformers.aliasToBean(Class1.class));
return query.list();
}
Run Code Online (Sandbox Code Playgroud)
在query.addScalar("col3",Hibernate.STRING)调用期间,我不知道col3使用什么类型(枚举类型).Hibernate.String不起作用!我也试图完全关闭类型(query.addScalar("col3"))但我得到了相同的InvocationTargetException.任何人都可以帮我解决这个问题吗?我的模型无法更改,我坚持使用本机SQL查询.任何想法都表示赞赏.