在spring security 3.0中,我们正在使用AuthenticationProcessingFilter类,我们使用的determineTargetUrl()方法是根据不同的角色返回url.
现在,我们正在转向spring security 3.1.0.RC3,我现在应该如何确定基于不同角色的url,因为AuthenticationProcessingFilter类已从新版本中删除.任何人都可以请给我一些简短的代码,以便我可以实现自定义过滤器重定向到不同角色的不同页面.
I am working on a Spring application on Tomcat7, JDK1.7, Maven and other components. Recently, I made a major change to the application, requiring switching over to Spring 3. After the change, I'm seeing the below exception on deploying to dev server. The application runs flawlessly on my local system though.
javax.servlet.ServletException: Servlet.init() for servlet amadeusAce threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    java.lang.Thread.run(Thread.java:722)
root cause
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/amadeusAce-servlet.xml]; …我需要在JSP页面中获取访问者的语言环境,以便我可以正确显示包含语言列表的下拉菜单,并根据其当前语言环境选择所选语言.通常我可能会做类似的事情${pageContext.request.locale}.
我认为问题是,只会根据用户的请求标题(浏览器发送的内容)给出区域设置.但是用户可能已经改变了他们的语言/语言环境,所以我需要使用Spring的机制来查看会话:
RequestContextUtils.getLocale(request).toString();
但是,在JSP页面中访问它并使JSP代码可以使用它并不容易.
或者是否有另一种更简单的机制向用户显示语言下拉菜单?Spring是否将当前语言环境存储在可从JSP轻松访问的对象中?
我有以下GET请求:
/api/search?filter.operation=Ping&filter.namespace=
请注意,参数名称包括前缀(filter.操作,filter.命名空间).
然后,我有以下我想用来接收这些参数的bean:
class MessageSearchFilter {
    String operation;
    String namespace;
    ...
}
处理程序方法具有以下签名:
public @ResponseBody String searchMessages(MessageSearchFilter filter, ...);
但是这不起作用,因为Spring MVC期望"操作"和"命名空间"属性的命名完全相同.如果我将请求更改为使用'operation'和'namespace'(没有'filter.'前缀),它就可以工作.
有什么方法可以告诉Spring期望参数以'filter'为前缀?
与此相关的一个问题是,如果我的方法签名包含多个具有冲突属性名称的表单对象,会发生什么?
我有一个GWT + Hibernate + JPA + Spring配置文件,可以使用Spring 3.0.x + Hibernate 3.6.x. 当我升级到Spring 3.1和Hibernate 4.0时,抛出以下异常:
与Hibernate 4和Spring 3.1有任何已知的不兼容性吗?
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [META-INF/application-context.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: myPu] Unable to build EntityManagerFactory
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
    at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:543)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513)
    at … 我是Spring Framework的新手.请指导我对Spring的基本了解.我了解Java和JSF,但我对Struts或其他框架一无所知.我已经搜索了互联网,并且能够下载PDF,但我不理解Spring流程,就像我理解JSF流程一样.请提供一些链接,以便了解Spring的流程.
我有一个JSP,我试图从我的模型中打印出值,但没有出现在我引用这些值的地方.这是我设置值的控制器方法.
@RequestMapping(value = "/poll1", method = RequestMethod.POST)
public String processPoll1(@RequestParam String vote,
        HttpServletResponse response, Model model) {
    Map<String, Object> resultMap = poll1DAO.tallyVote(vote);
    Cookie poll1 = new Cookie("poll1", "voted");
    model.addAttribute("poll1Yes", resultMap.get("yes").toString());
    model.addAttribute("poll1No", resultMap.get("no").toString());
    poll1.setMaxAge(maxSeconds);
    response.addCookie(poll1);
    return "redirect:/polls";
}
这是JSP中引用Model属性的部分.
<table>
    <tr>
        <td><b><i>Poll #1 -- </i></b>Would you like to have a 30-year reunion in 2016?<br></td>
    </tr>
    <tr>
        <td><b>Yes</b></td>
        <td> – <c:out value='${model.poll1Yes}' /><br /></td>
    </tr>
    <tr>
        <td><b>No</b></td>
        <td> – <c:out value='${model.poll1No}' /><br />
        </td>
    </tr>
</table>
这是我的输出.不是实际值,而是在属性的位置打印出任何内容.
Poll #1 -- Would you like to have a …我的应用程序中有一个名为Foo的数据类型,如下所示:
public class Foo {
  // synthetic primary key
  private long id; 
  // unique business key
  private String businessKey;
  ...
}
此类型在整个Web应用程序中以多种形式使用,通常您希望使用该id属性来回转换它,因此我实现了Spring3 Formatter,并使用全局Spring转换服务注册该格式化程序.
但是,我有一个表单用例,我想用转换来转换businessKey.实现Formatter很容易实现,但是我怎么告诉Spring只为这个特定的表单使用该格式化程序呢?
我在http://static.springsource.org/spring/previews/ui-format.html上找到了一个文档,其中有一节关于注册特定于字段的格式化程序(在底部一直见5.6.6),它提供了这个示例:
@Controller
public class MyController {
  @InitBinder
  public void initBinder(WebDataBinder binder) {
    binder.registerFormatter("myFieldName", new MyCustomFieldFormatter());
  }        
  ...
}
这正是我想要的,但是这是2009年的预览文档,它看起来并不像registerFormatter最终发布的API那样.  
你怎么这么做的?
我是新来的春天.我正在使用spring webmvc开发REST api.对于错误处理我得到了这个链接http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-rest-spring-mvc-exceptions
我试图在我的项目中使用ResponseEntityExceptionHandler.但是每当我的控制器抛出异常时,它就永远不会到达这个ResponseEntityExceptionHandler.
以下是我的代码段
调节器
@Controller
@RequestMapping("/hello")
public class HelloController {  
    private static final Logger logger = Logger.getLogger(HelloController.class);
    @RequestMapping(value="/{name}", method=RequestMethod.GET)
    public @ResponseBody String greet(@PathVariable(value = "name")String name ) throws InvalidInputException, ResourceNotFoundException{
        logger.info("start greet() "+name );
        System.out.println("start greet() "+name);
        String message = null;
        if("".equalsIgnoreCase(name))
        {
            throw new InvalidInputException("Invalid Input");
        }
        List<String> names = new ArrayList<String>();
        names.add("Harshal");
        names.add("Smitesh");
        if(names.contains(name)){
            message = "Hello "+ name;
        }else{
            throw new ResourceNotFoundException("Requested Resource not found");
        }
        System.out.println("end greet");
        logger.info("end greet()");
        return message;
    }
} …我正在使用Spring和EhCache
我有以下方法
@Override
@Cacheable(value="products", key="#root.target.PRODUCTS")
public Set<Product> findAll() {
    return new LinkedHashSet<>(this.productRepository.findAll());
}
我有其他使用@Cacheable和@CachePut以及@CacheEvict的方法.
现在,假设数据库返回100个产品并且它们被缓存key="#root.target.PRODUCTS",然后其他方法将插入 - 更新 - 删除项目到数据库中.因此,通过它缓存的产品key="#root.target.PRODUCTS"不再相同,例如数据库.
我的意思是,检查以下两种方法,他们能够更新/删除一个项目,同一项目缓存在另一个key="#root.target.PRODUCTS"
@Override
@CachePut(value="products", key="#product.id")
public Product update(Product product) {
    return this.productRepository.save(product);
}
@Override
@CacheEvict(value="products", key="#id")
public void delete(Integer id) {
    this.productRepository.delete(id);
}
我想知道是否可以通过更新/删除位于缓存中的项目key="#root.target.PRODUCTS",如果产品已更新,则为100,如果删除了产品,则为499.
我的观点是,我想避免以下情况:
@Override
@CachePut(value="products", key="#product.id")
@CacheEvict(value="products", key="#root.target.PRODUCTS")
public Product update(Product product) {
    return this.productRepository.save(product);
}
@Override
@Caching(evict={
        @CacheEvict(value="products", key="#id"),
        @CacheEvict(value="products", key="#root.target.PRODUCTS")
})
public void delete(Integer id) {
    this.productRepository.delete(id); …