当前位置: 首页 > 知识库问答 >
问题:

在SpringMVC中,如何动态设置会话属性的构造函数参数?

祁飞扬
2023-03-14

我们正在构建一个与远程API通信的webapp。我想这样设计这个远程API的客户端:

def RemoteApi
  constructor (username, password)
  getCurrentUser()  //implementation will use username and password
  getEmployees()  //implementation will use username and password
  ...

关键是,我想在构建期间将凭据传递给这个客户端,并让所有其他方法使用这些凭据。我的第二个要求是我希望这个RemotePi实例在会话中。

我在这里发现了如何传递动态构造函数参数。

我在这里发现了如何创建会话属性。

但我想不出一种方法来结合这两种技术。据我所知,您必须在自己的类getter方法中实例化会话属性。这种类似getter的方法将无法访问表单的字段,因此此时我将无法传递凭据。

这是我卡住的地方:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;

import java.util.Map;

@Controller
@SessionAttributes("remoteClient")
public class LoginController {

    @Value("${company.name}")
    private String companyName;

    @Autowired
    private RemoteClient remoteClient;

    @ModelAttribute("remoteClient")
    public RemoteClient addRemoteClientToSession() {
        return remoteClient;  //how do initialize this with credentials in here?
    }

    @RequestMapping("/")
    public String showLogin(Model model) {
        model.addAttribute("credentials", new Credentials());
        return "login";
    }

    @RequestMapping("/login")
    public String login(@ModelAttribute("credentials") Credentials credentials, Map<String, Object> model) {
        if (remoteClient.auth(companyName, credentials.getUsername(), credentials.getPassword())) {
            model.put("fullname", remoteClient.findCurrentUser().getName());
            return "projectView";
        } else {
            return "login";
        }
    }
}

更新:也许解决方案与这种技术有关。在此之前我不知道Model AndView

共有1个答案

太叔京
2023-03-14

我在问题中链接到的文章确实有必要的技巧。我要做的是创建一个@AutowiredRemotePiFactory,它有一个newInstance(Credentials)方法,并将其传递给addObjectnewInstance的实现可能最终会使用new关键字。如果有人知道如何避免这个细节,我很想听听。

以下是根据我的需求调整的示例:

@Controller
@SessionAttributes("remoteApi")
public class SingleFieldController {

    @Autowired
    private RemoteApiFactory remoteApiFactory;    

    @RequestMapping(value="/single-field")
    public ModelAndView singleFieldPage() {
        return new ModelAndView("single-field-page");
    }

    @RequestMapping(value="/remember")  
    public ModelAndView rememberThought(@MethodAttribute("credentials") Credentials credentials) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("remoteApi", remoteApiFactory.newInstance(credentials));
        modelAndView.setViewName("single-field-page");
        return modelAndView;
    }
}
 类似资料:
  • 1.如何通过参数化构造函数设置这些属性?? 类文件 > 我想通过传递参数构造函数的setter设置这些属性,但它没有设置这些属性 在这里,我想通过toString方法显示属性 }对象文件 为什么我无法通过构造函数设置这些属性?? public class Runnable{public static void main(String[]args){Product p1=新产品(“pc”,“Grey

  • 我正在构建一个API并使用swagger测试endpoint。我有一个产品: 在这个DTO中,我想使用在我的代码中使用的Price类。价格类如下所示: 但是由于私有设置器在类中使用,我无法使用swagger设置这些值(它在这些上具有属性)。我真的很喜欢这种拥有私有设置器并使用构造函数设置值的方法,顺便说一句,这是公共的。有没有办法我可以使用swagger为类设置值,并且仍然在属性上使用私有设置器?

  • 下面是使用的示例。向导完成后,如何清除用户会话属性?在我的示例中,在返回到之后会话属性仍然存在。我尝试了和,但它不起作用。 我的错误<代码>状态。setComplete() 工作正常<代码>会话。removeAttribute(“用户”)在这里不需要做什么。

  • 在kotlin中,如何将主构造函数中属性的setter设置为私有? 我希望属性<code>name</code>的setter是私有的,而getter是公共的,我该怎么做?

  • 我正在尝试从我的主方法创建一个Spring bean。 我已将此bean配置为具有特定属性。这些值是在由@Configuration注释的SpringConfig类中指定的。 bean是使用Spring Application Context在我的main()方法中创建的。bean成功启动,但它没有我在SpringConfig类中指定的属性。我不明白为什么? 我可能已经确定了问题的原因:这个bea

  • 题目说明了一切,我得到了一个类,其中构造函数的变量必须是私有的。 当然,它附带了变量的公共。 现在问题就在我尝试制作一个名为 Magazine 的子类之后。该类应继承名称和价格,但对于每个对象启动,价格都是恒定的。所以它们不会作为名称出现在构造函数上。 这也带有它自己的。 我试图将价格放在构造函数中,但构造函数需要一个传递的参数。使用还会通知父构造函数中没有一个具有这样的形状。 当我尝试使用父类方